2009-10-09 5 views
0

У меня есть строка, которая выглядит следующим образом: mynum(1234) and mynum(123) and mynum (12345) and lastly mynum(#123)с помощью Java регулярное выражение, как я могу заменить все, когда шаблон содержит левую скобку

Я хочу, чтобы вставить # перед числами в скобках, так что я есть: mynum(#1234) and mynum(#123) and mynum (#12345) and lastly mynum(#123)

Как это сделать? Использование регулярных выражений шаблона Искателя и replaceAll дроссели на ( перед номером и я получаю

java.util.regex.PatternSyntaxException: незавершенная группу рядом ...

исключение.

ответ

4

Try:

String text = "mynum(1234) and mynum(123) and foo(123) mynum (12345) and lastly mynum(#123)"; 
System.out.println(text.replaceAll("mynum\\s*\\((?!\\s*#)", "$0#")); 

Небольшое объяснение:

Заменить каждый шаблон:

mynum // match 'mynum' 
\s*  // match zero or more white space characters 
\(  // match a '(' 
(?!  // start negative look ahead 
    \s* // match zero or more white space characters 
    #  // match a '#' 
)  // stop negative look ahead 

с подстроки:

$0# 

Где $ 0 содержит текст это матовый hed всем регулярным выражением.

+0

Awesome !!! Это сработало. Кроме того, спасибо за объяснение. Это было очень полезно. Теперь мне просто нужно сделать некоторые исследования, чтобы понять, что такое «негативный взгляд вперед» –

+0

@KT: посмотрите на этот учебник: http://www.regular-expressions.info/lookaround.html –