Регекс не соответствует - PullRequest
4 голосов
/ 05 мая 2011

У меня проблема с регулярным выражением в такой ситуации: мне нужно извлечь (и заменить) все точки из такой конструкции:

any_symbols->white_space->x.(or xx. or Xx. or xX. or xy. or yy. etc.)->white_space->any_symbol_not_upper_case_and_not_a_digit

например

1990 x. abcd  -  extract dot

ffff xx.abcd  -  extract dot

1990 x. Abcdef    -  do not extract

abcd x. Abcd      -  do not extract

abcd x. 1990      -  do not extract

Так что япостроил такое регулярное выражение:

(?<=\s[XxYy]{1,2})\.(?>=\s+?[^\p{javaUpperCase}\d])

Но оно не соответствует.Так что не так?

Спасибо

PS

После

String skipPtrn="(?<=\\s[РрГг]{1,2})\\.(?>=\\s+?[^\\p{javaUpperCase}\\d])";
originalText=originalText.replaceAll(skipPtrn, " ");

Я все еще нахожу в тексте:

1673 р.з'явився

У 1623 р.через

у 1925 р.("Вiсник

и т. Д.

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Попробуйте удалить знак > из группы просмотра в будущее: (?<=\s[XxYy]{1,2})\.(?=\s+?[^\p{javaUpperCase}\d]). Вы можете сделать (?>x) (атомная группа) или (?=x) (положительный прогноз нулевой ширины), но не (?>=x).

Также обратите внимание, что ваш второй пример не соответствует вашему описанию и не будет соответствовать приведенному выше регулярному выражению.

1 голос
/ 05 мая 2011

смотреть в будущее совсем не обязательно:

$ perl -wne 's/^(\w+\s+[XxYy]{1,2})\.(\s*[^A-Z\d]+)$/$1$2/;print' <data.txt 
1990 x abcd
ffff xxabcd
1990 x. Abcdef
abcd x. Abcd
abcd x. 1990
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...