2016-06-13 4 views
2

Я хочу заменить слово в предложении, используя замену java regex.Заменить слово, используя java regex, но не котировки

тест строка a_b a__b a_bced adbe a_bc_d 'abcd' ''abcd''

, если я хочу, чтобы заменить все слова, которые начинаются с дефиса & заканчивается д. Я использую String.replaceAll("(?i)\\ba[a-zA-Z0-9_.]*d\\b","temp").

его замена в a_b a__b temp adbe a_bc_d 'temp' ''temp''

Что должно быть мое регулярное выражение, если я не хочу, чтобы рассмотреть строку в кавычки.?

Я использовал String.replaceAll("[^'](?i)\\ba[a-zA-Z0-9_.]*d\\b[^']","temp") Его заменили как a_b a__btempadbe temp'abcd' ''abcd''. Удаление одного пробела этого слова. Есть ли способ заменить только эту строку не внутри кавычек?

PS: есть обходное решение для этого String.replaceAll("[^'](?i)\\ba[a-zA-Z0-9_.]*d\\b[^']"," temp "). Но в некоторых случаях это терпит неудачу.

Что должно быть моим регулярным выражением, если я хочу заменить слово в предложении & Я не должен рассматривать строку в боковых цитатах.? Спасибо, Advance ... !!!

ответ

0

тестирование, если есть или нет цитаты до и после того, как цель неправильный подход, потому что вы не можете знать, если описанная цитата - это вступительная цитата или заключительная цитата. (попробуйте добавить цитату в начале тестовой строки и проверьте наивный рисунок, вы увидите: 'inside'a_outside_d'inside').

Единственный способ узнать, есть ли что-либо внутри или снаружи кавычек, - проверить строку с начала (или с конца, но она менее удобна и, в конечном счете, подвержена ошибкам, если кавычки не сбалансированы). Чтобы сделать это, вы должны описать все возможные подстроки до цели, например:

\G([^a']*+(?:'[^']*'[^a']*|\Ba+[^a']*|a(?!\w*d\b)[^a']*)*+)\ba\w*d\b 

детали:

\G # matches the start of the string or the position after the previous match 
(
    [^a']*+ # all that isn't an "a" or a quote 
    (?: 
     '[^']*'  [^a']* # content between quotes 
     | 
     \Ba+  [^a']* # "a" not at the start of a word 
     | 
     a(?!\w*d\b) [^a']* # "a" at the start of a word that doesn't end with "d" 
    )*+ 
) # all that can be before the target in a capture group 
\ba\w*d\b # the target 

Не забывайте, чтобы избежать обратной косой черты в строке Java: \ =>\\.

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

$1temp 

Примечание: для обработки кавычки экранированы в кавычки, изменить '[^']*' на:
'[^\\']*+(?s:\\.[^\\']*)*+'.

Demo: нажмите кнопку Java.