Регулярное выражение для поиска слов внутри строки

Пожалуйста, помогите с регулярным выражением для использования в качестве Pattern в Linkify.

Я пытаюсь извлечь #хэштеги и @упоминания внутри строки, поэтому мне нужно найти в строке слова, которые начинаются с # и @ (и заканчиваются пробелом конечно), только в одном регулярном выражении.

Внутри слова мне нужно допустить все возможные символы на любом языке (где-то :)).

Спасибо.

ИЗМЕНИТЬ

Когда я говорю все возможные символы, я ошибаюсь: мне в любом случае нужно следовать тем же правилам твиттера, поэтому, например, такие символы, как -, не допускаются.


person shaithana    schedule 02.08.2015    source источник
comment
Вы ориентируетесь на данные Twitter?   -  person suztomo    schedule 02.08.2015
comment
@gonbe нет, это только для внутреннего пользования.   -  person shaithana    schedule 02.08.2015
comment
Трудно проверить любые возможные символы на любом языке для внутренней системы...   -  person suztomo    schedule 02.08.2015
comment
@gonbe извините, я плохо объяснил. Это для внутреннего использования, но правила использования хэштегов такие же, как и в Twitter.   -  person shaithana    schedule 02.08.2015


Ответы (3)


ОБНОВИТЬ

Увидев, что вы хотите идентифицировать хэш-теги в соответствии с Twitter, и прочитав _Actual_ Формат Twitter для хэштегов? Не ваше регулярное выражение, не его код — реальный?

Попробуйте этот шаблон:

"^[@#]\\w+|(?<=\\s)[@#]\\w+"

Соответствует словам, начинающимся с "@" или "#", которые находятся либо в начале строки, либо перед ними стоит пробел.

Пример кода:

public static void main(String[] args) throws Exception {
    String string = "#hashtags and @mentions";
    Matcher matcher = Pattern.compile("^[@#]\\w+|(?<=\\s)[@#]\\w+").matcher(string);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

Результаты:

#hashtags
@mentions
person Shar1er80    schedule 02.08.2015

Если вам нужны правила Twitter, почему бы не использовать библиотеку от тех, кто знает правила лучше, чем кто-либо другой: самого Твиттера? :-)

Если вы используете Gradle, вы можете просто добавить compile 'com.twitter:twitter-text:1.12.1' к зависимостям в файле Gradle.

Или для Maven добавьте в pom.xml:

<dependencies>
  <dependency>
    <groupId>com.twitter</groupId>
    <artifactId>twitter-text</artifactId>
    <version>1.12.1</version>
  </dependency>
</dependencies>

Затем в своем коде вы можете вызвать библиотеку Twitter следующим образом:

import com.twitter.Extractor;

public class Main {
    public static void main(String[] args) {
        Extractor extractor = new Extractor();
        String text = "extracting hashtags and mentions in #java using @twitter library from @github";

        System.out.println("#hashtags:");
        for (String hashtag : extractor.extractHashtags(text)) {
            System.out.println(hashtag);
        }

        System.out.println();
        System.out.println("@mentions:");
        for (String mention : extractor.extractMentionedScreennames(text)) {
            System.out.println(mention);
        }
    }
}
person Helder Pereira    schedule 02.08.2015

Попробуйте это регулярное выражение (используйте \\ вместо \ в Java:

/(#\S+)|(@\S+)/g

or

/([#@]\S+)/g

Вы также можете использовать это, чтобы использовать замену \1:

/.*?([#@]\S+)[^#@]*/g

[демонстрация регулярных выражений]

и если вы хотите удалить # и @, используйте это:

/.*?[#@](\S+)[^#@]*/g

or

/.*?[#@](\S+)[^#@\-]*/g

String rgx = ".*?[#@](\S+)[^#@\-]*";
Pattern pattern = Pattern.compile(rgx, Pattern.DOTALL);
person shA.t    schedule 02.08.2015
comment
Должно быть + вместо *? - person PM 77-1; 02.08.2015
comment
Кроме того, в Java не используйте символы /. Фактически, поскольку java является единственным языковым тегом в вопросе, я бы полностью изменил ваш ответ, чтобы использовать синтаксис Java; то, что вы написали, подходит для JavaScript или Perl, но не для Java. Кроме того, я не уверен, что g имеет какое-то значение, если вы не делаете замену. - person ajb; 02.08.2015
comment
* соответствует нулевому вхождению. Например, «#». - person suztomo; 02.08.2015
comment
Если я хорошо это понимаю, /.*?[#@](\S+)[^#@\-]*/g может помочь ;). - person shA.t; 02.08.2015
comment
Почему бы вам не написать регулярное выражение для шаблона в Linkify? - person suztomo; 02.08.2015
comment
@GiovanniDiGregorio мой комментарий здесь к shA.t - person suztomo; 02.08.2015