2015-01-19 3 views
0

Цель: для данного термина я хочу проверить, существует ли этот термин в начале слова. Например, если термин «t». затем в Сентанс:Java regex соответствует началу слова?

"Это трудно один Thats его"

Я хочу, чтобы вернуться "правда" из-за:

это,, Thats

так считают:

public class HelloWorld{ 

public static void main(String []args){ 

    String term = "t"; 
    String regex = "/\\b"+term+"[^\\b]*?\\b/gi"; 
    String str = "This is the difficult one Thats it"; 
    System.out.println(str.matches(regex)); 

} 
} 

Я получаю следующее Exception:

Exception in thread "main" java.util.regex.PatternSyntaxException: 
Illegal/unsupported escape sequence near index 7           
/\bt[^\b]*?\b/gi                
    ^                  
     at java.util.regex.Pattern.error(Pattern.java:1924)     
     at java.util.regex.Pattern.escape(Pattern.java:2416)     
     at java.util.regex.Pattern.range(Pattern.java:2577)     
     at java.util.regex.Pattern.clazz(Pattern.java:2507)     
     at java.util.regex.Pattern.sequence(Pattern.java:2030)     
     at java.util.regex.Pattern.expr(Pattern.java:1964)      
     at java.util.regex.Pattern.compile(Pattern.java:1665)     
     at java.util.regex.Pattern.<init>(Pattern.java:1337)     
     at java.util.regex.Pattern.compile(Pattern.java:1022)     
     at java.util.regex.Pattern.matches(Pattern.java:1128)     
     at java.lang.String.matches(String.java:2063)       
     at HelloWorld.main(HelloWorld.java:8) 

Также следующее не работает:

import java.util.regex.*; 
public class HelloWorld{ 

public static void main(String []args){ 

    String term = "t"; 
    String regex = "\\b"+term+"gi"; 
    //String regex = "."; 
    System.out.println(regex); 
    String str = "This is the difficult one Thats it"; 
    System.out.println(str.matches(regex)); 


    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(str); 
    System.out.println(m.find()); 
} 
} 

Пример: {Это, один, два, Те, спасибо} для слова This Two These Thanks; результат должен быть правдой.

Благодаря

+0

Первая версия не работает, потому что это Perl/javascript и т. д. синтаксис и не просто регулярное выражение. То же самое касается второй попытки, обратите внимание, что 'gi' не является флагом, а частью выражения. – Thomas

ответ

1

Поскольку вы используете движок регулярных выражений Java, вам нужно записать выражения таким образом, Java понимает. Это означает удаление конечных и ведущих косых черт и добавление флагов как (?<flags>) в начале выражения.

Таким образом, вы должны были бы вместо этого:

String regex = "(?i)\\b"+term+".*?\\b" 

Посмотрите regular-expressions.info/java.html для получения дополнительной информации. Сравнение поддерживаемых функций можно найти здесь (так же, как точки входа): regular-expressions.info/refbasic.html

0
String regex = "(?i)\\b"+term; 

В Java, модификаторы должны быть вставлены между "(?" И есть вариант для включения их снова и ")": "(-?" И ")".

Для поиска всех слов, начинающихся с «T» или «t», вы можете повторно использовать метод поиска Matcher. Если вам просто нужно смещение, метод запуска Matcher возвращает смещение.

Если вам нужно, чтобы соответствовать полному слову, используйте

String regex = "(?i)\\b"+term + "\\w*"; 
+0

'(? Gi)' не будет работать, так как 'g' неизвестен механизму регулярного выражения Java – Thomas

+0

@Thomas Спасибо - и там я обсуждал повторное использование find: -o – laune

0
String str = "This is the difficult one Thats it"; 
    String term = "t"; 
    Pattern pattern = Pattern.compile("^[+"+term+"].*",Pattern.CASE_INSENSITIVE); 

    String[] strings = str.split(" "); 
    for (String s : strings) { 
     if (pattern.matcher(s).matches()) { 
      System.out.println(s+"-->"+true); 
     } else { 
      System.out.println(s+"-->"+false); 
     } 
    } 
1

В Java мы не окружают регулярное выражение с / поэтому вместо "/regex/flags" мы просто написать regex. Если вы хотите добавить флаги, вы можете сделать это с помощью синтаксиса (?flags) и поместить его в регулярное выражение в позиции, из которой должен применяться флаг, например a(?i)a сможет найти aa и aA, но не Aa, потому что флаг был добавлен после первого a.
Вы также можете составить регулярное выражение в Pattern как этот

Pattern pattern = Pattern.compile(regex, flags); 

где regex является String (опять-таки не прилагается /) и flag является целым числом построить из констант из Образца как Pattern.DOTALL или когда вам нужно больше флагов вы можете использовать Pattern.CASE_INSENSITIVE|Pattern.MULTILINE.

Следующая вещь, которая может вас смутить, это matches метод. Большинство людей ошибается по имени, потому что они предполагают, что он попытается проверить, может ли он find в строковом элементе, который может быть сопоставлен regex, но на самом деле он проверяет, может ли целая строка быть сопоставлена ​​регулярным выражением.

То, что вам кажется, это механизм для проверки некоторого регулярного выражения, который можно найти по крайней мере один раз в строке. В этом случае вы можете либо

  • добавить .* в начале и в конце вашего регулярного выражения, чтобы другие символы, которые не являются частью элемента, который вы хотите найти подкрепляться регулярными выражениями, но таким образом matches должен перебрать всю строку
  • Matcher object build from Pattern (представляющий ваше регулярное выражение) и используйте его метод find(), который будет проходить до тех пор, пока не найдет совпадение для регулярного выражения или не найдет конец строки. Я предпочитаю этот подход, потому что ему не нужно будет перебирать всю строку, но остановится, когда будет найдено совпадение.

Так что ваш код может выглядеть

String str = "This is the difficult one Thats it"; 
String term = "t"; 
Pattern pattern = Pattern.compile("\\b"+term, Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher(str); 
System.out.println(matcher.find()); 

В случае, если Ваше term может содержать несколько регулярных выражений специальные символы, но вы хотите, движок регулярных выражений, чтобы рассматривать их как обычные символы, которые вы должны убедиться, что они будут экранированы , Для этого вы можете использовать Pattern.quote метод, который добавит все необходимые побеги для вас, так что вместо

Pattern pattern = Pattern.compile("\\b"+term, Pattern.CASE_INSENSITIVE); 

для безопасности следует использовать

Pattern pattern = Pattern.compile("\\b"+Pattern.quote(term), Pattern.CASE_INSENSITIVE); 
Смежные вопросы