2015-01-28 2 views
-1

Я использую регулярные выражения, и я наткнулся на^xxx и xxx $, что означает совпадение xxx regex в начале строки и соответствует регулярному выражению xxx в конце строки. explaing это с примером, я с трудом понимая это

+0

Не в начале _line_, а в начале _input_. Regex '^' будет соответствовать до 'foo' в' foo \ nbar', но не до 'bar'. – fge

+1

Если включен многострочный режим. – sp00m

+0

Да, это, но давайте все упростим для OP, который, похоже, не понимает концепций этих якорей ... – fge

ответ

2

Это все сводится к тому, какой метод вы используя для соответствия.

Если вы используете String.matches(), то он будет рассматривать всю строку поэтому определение ^ или $ совершенно бесполезно.

При использовании Pattern и Matcher, чтобы соответствовать, то вы можете использовать ^ и $ так:

Пример: 1

public static void main(String[] args) { 
    String s = "abcabc"; 
    Pattern p = Pattern.compile("abc"); 
    Matcher m = p.matcher(s); 
    System.out.println(m.find()); 
    System.out.println(m.start()); // prints starting index of match 
} 

O/P:

true 
0 

Пример: 2

public static void main(String[] args) { 
    String s = "abcabc"; 
    Pattern p = Pattern.compile("abc$"); 
    Matcher m = p.matcher(s); 
    System.out.println(m.find()); 
    System.out.println(m.start()); // prints starting index of match 
} 

O/P:

true 
3 

Пример -3:

public static void main(String[] args) { 
    String s = "xxabc\nabc"; 
    Pattern p = Pattern.compile("^abc"); 
    Matcher m = p.matcher(s); 
    System.out.println(m.find()); 
    System.out.println(m.start()); 
} 

false 
Exception in thread "main" java.lang.IllegalStateException: No match available 
    at java.util.regex.Matcher.start(Unknown Source) 
    at Test.main(Test.java:10) --> OOPs.. Not at the beginning? 
1

^xxx матчи все строки начинаются с которым xxx

  • xxx1234 -> матч
  • xxxABDcx -> матч
  • xxassas -> не ровня

xxx$ матчи все строки не заканчивается xxx

  • 1234xxx -> матч
  • Acdsadsxx -> нет матча
2

Это имеет смысл, если вы ищете для некоторых частей строки, как в этом поиске и заменить, например:

System.out.println("test test test".replaceAll("^test", "TEST")); 
System.out.println("test test test".replaceAll("test$", "TEST")); 

Выходы

TEST test test 
test test TEST 

Но если вы пытаетесь соответствовать всей строке вы получаете ^ и $ подставляется автоматически:

System.out.println("test test test".matches("test")); 
System.out.println("test test test".matches("^test$")); // The same 

и возвращают false.

1

Значение:

  • ^ - Начало документа/строки.
  • $ - Конец документа/строка.

Краткие примеры:

  • "найти файлы, чьи авторы имеют отвратительную привычку набрав возврат каретки в конце":

\n$

Pattern pattern = Pattern.compile("\n$"); 
String string1 = "This is a document."; 
String string2 = "This is a document.\n"; 
Matcher matcher1 = pattern.matcher(string1); 
Matcher matcher2 = pattern.matcher(string2); 
System.out.println(matcher1.find());// false 
System.out.println(matcher2.find());// true 
  • "найти документы, которые начинаются с буквы":

^[A-Z]

Pattern pattern = Pattern.compile("^[A-Z]"); 
String string1 = "This is a document."; 
String string2 = "this is a document."; 
Matcher matcher1 = pattern.matcher(string1); 
Matcher matcher2 = pattern.matcher(string2); 
System.out.println(matcher1.find());// true 
System.out.println(matcher2.find());// false 
1

Простой пример был бы:

System.out.println("abc".replaceAll("abc", "xxx")); 
System.out.println("abc".replaceAll("bc", "xx")); 
System.out.println("abc".replaceAll("^bc", "xx")); 
System.out.println("abc".replaceAll("bc$", "xx")); 
System.out.println("abc".replaceAll("^ab", "xx")); 
System.out.println("abc".replaceAll("ab$", "xx")); 

И выход:

xxx 
axx 
abc 
axx 
xxc 
abc 

Где x представляет собой совпадение символов.

1

Этот код:

if (Pattern.matches("^123.*", "123blablabla")) { 
    System.out.println("It matches!"); 
} 
else { 
    System.out.println("It does not match!"); 
} 

Выведет:

Это соответствует!

потому что строка «123blablabla» начинается с «123», а за ней следует ноль или более символов («. *» В языке regexp).

Аналогичным образом, следующий код:

if (Pattern.matches(".*abc$", "some string that ends with abc")) { 
    System.out.println("It matches!"); 
} 
else { 
    System.out.println("It does not match!"); 
} 

выведет

Это соответствует!

потому что строка «некоторая строка, которая заканчивается на abc» заканчивается на «abc».

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