2013-07-03 3 views
0

Я проверил пару учебных пособий в Интернете по регулярным выражениям Java, но мне все еще сложно создавать регулярные выражения.Построение регулярных выражений в Java

Образец текста (твит):

@HIMYM_CBS: Barney Stinson. That Guy's Awesome 

Другой образец:

Barney Stinson. @HIMYM_CBS: That Guy's Awesome 

Это твит к HIMYM_CBS.

Что я хочу достичь, учитывая любой твит, я хочу знать, адресован ли этот твит любой (как в данном случае HIMYM_CBS). Неважно, к кому это относится.

Мой вопрос: Итак, какова должна быть моя линия мышления для построения регулярного выражения для достижения этого?

твиты сохраняются в виде строки:

String Tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome"; 
+0

Какие проблемы вы с? –

+0

@RohitJain, мне нужна помощь в создании регулярного выражения для этого случая – Chaos

+1

См. Мой ответ. – Makky

ответ

1
String tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome"; 
Pattern p = Pattern.compile("@(\\w+)"); 
Matcher m = p.matcher(tweet); 
if (m.find()) { 
    System.out.println(m.group(1)); 
} else { 
    System.out.println("not found."); 
} 

Может быть, вы хотите проверить апи документацию Pattern класса.

В коде \w обозначается символ слова, который эквивалентен [a-zA-Z_0-9].

+0

Спасибо, я не могу понять \\ w *. \ w является символом слова? Что делает первый \ in \\ w = do? – Chaos

+0

Это даст вам всех персонажей после @. Это еще один способ. – Makky

+2

@Chaos: Регулярное выражение '@ (\ w +)'. Но в Java регулярные выражения производятся из строк и строк, символ '\' является особым, поэтому для включения '' 'в строку, мы' убежим' с другим '\'. Следовательно: '@ (\\ w +)" ' –

0
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String Tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome"; 
     String regex = "@([^:]+)"; 
     Pattern compile = Pattern.compile(regex); 
     Matcher matcher = compile.matcher(Tweet); 
     if (matcher.find()) { 
      System.out.println(matcher.group(1)); 
     } 

    } 

} 

Выход: HIMYM_CBS

+0

Что означает [^:] означает? не двоеточие? – Chaos

+0

Это означает, что получить всю строку между @ и:. Ваше имя пользователя/id находится между @ и:. значение – Makky

+0

@Chaos да, это означает «ничего, кроме a». Регулярное выражение Makky найдет начало @, а затем соответствует следующему:. – feralin

2

бы регулярное выражение

@\\w+ 

работу?

+0

будет ли это работать, если есть что-то еще до @? – Chaos

+0

@Chaos Да, я считаю, это было бы ... – feralin

+0

Почему бы вам не использовать '@ \\ w +' вместо этого или он недоступен в java-вкусе? – HamZa

1
/(?:^|(?<=\s))@([A-Za-z_0-9]+)(?=[.?,:]?\s)/ 

Вы можете использовать только буквы, цифры или символ подчеркивания (_) в ручке Twitter.

Образец тест:
@This (соответствует в начале строки) регулярное выражение игнорирует @ этом но матчи на @separate лексем, а также лексемы в конце предложения, как @this. или @this? (без выбора . или ?) и @this: и @this, как в прямом сообщении SO style. И да, любые [email protected] в твитах также игнорируются.

Регулярное выражение, подбирая на @ также позволяет быстро получить доступ к что после того, как он (как userid в @userid), выбрав его вид: Matcher#group(1).

4

Имена пользователей MSN не более 15 символов и начинаются с символа @ и могут содержать только буквы и символы подчеркивания.

Таким образом, регулярное выражение, которое вы хотите использовать:

(?<=\s|\A)@(\w{1,15}) 
^ ^^^ ^^^^^ ^")" ends a matching group. 
| | || |||| | matches preceding expression between 1 and 15 times. 
| | || |||| "\w" matches [a-zA-Z0-9_] 
| | || ||| "(" begins a matching group 
| | || || literal "@" 
| | || | ")" ends the zero-width lookbehind assertion 
| | || "\A" will match the beginning of the string 
| | | "|" denotes that either this or that matches 
| | "\s" matches a space character 
| "(?<=" is the beginning of a zero-width lookbehind assertion 
+1

Извините, использование \ b здесь неверно. Я никогда не использую его рядом с символами без слова, такими как @; Я думаю, что это соответствует только символу слова и символу, отличному от слова (или в начале или в конце источника), поэтому выше будет соответствовать 'abc @ def', но не' abc @ def', а не «Другой пример» "в исходном вопросе. – ajb

+0

@ajb, Ах! Вы правы, я обновил свой ответ. – OmnipotentEntity

Смежные вопросы