正则表达式不匹配

时间:2011-05-05 11:30:29

标签: java regex text-processing

在这种情况下,我遇到了regexp的麻烦: 我需要从这种结构中提取(并替换)所有点:

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])

但它不匹配。那有什么不对?

由于

P.S。

之后

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

我仍然在文中找到:

  

1673р。 з'явився

     

У1623р。 через

     

至1925年。 (“Вiсник

2 个答案:

答案 0 :(得分:2)

尝试从前瞻组中删除>符号:(?<=\s[XxYy]{1,2})\.(?=\s+?[^\p{javaUpperCase}\d])。您可以执行(?>x)(原子组)或(?=x)(零宽度正向前瞻)但不能(?>=x)

另请注意,您的第二个示例与您的描述不符,并且不会与上述正则表达式匹配。

答案 1 :(得分:1)

根本不需要向前看:

$ 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