Заменить знак вопроса (?) На (\\?) - PullRequest
23 голосов
/ 29 декабря 2010

Я пытаюсь определить шаблон для сопоставления текста с вопросительным знаком (?) Внутри.В регулярном выражении вопросительный знак считается «один раз или не на всех». Так можно ли заменить знак (?) В моем тексте на (\\?), Чтобы исправить проблему с шаблоном?

String text = "aaa aspx?pubid=222 zzz";
Pattern p = Pattern.compile( "aspx?pubid=222" );
Matcher m = p.matcher( text );

if ( m.find() )
 System.out.print( "Found it." );
else
 System.out.print( "Didn't find it." );  // Always prints.

Ответы [ 2 ]

42 голосов
/ 29 декабря 2010

Вы должны экранировать ? как \\? в регулярном выражении , а не в тексте .

Pattern p = Pattern.compile( "aspx\\?pubid=222" );

See it

Вы также можете использовать метод quote класса Pattern для цитирования метасимволов регулярного выражения, таким образом you не нужно беспокоиться о цитировании их:

Pattern p = Pattern.compile(Pattern.quote("aspx?pubid=222"));

Посмотреть это

3 голосов
/ 29 декабря 2010

Правильный способ экранирования любого текста для регулярного выражения в Java - использовать:

String quotedText = Pattern.quote("any text goes here !?@ #593 ++ { [");

Тогда вы можете использовать quotedText как часть регулярного выражения.Например, ваш код должен выглядеть так:

String text = "aaa aspx?pubid=222 zzz";
String quotedText = Pattern.quote( "aspx?pubid=222" );
Pattern p = Pattern.compile( quotedText );
Matcher m = p.matcher( text );

if ( m.find() )
    System.out.print( "Found it." ); // This gets printed
else
    System.out.print( "Didn't find it." ); 
...