正则表达式不匹配。

4

我在正则表达式方面遇到了麻烦: 我需要从以下结构中提取(并替换)所有的点:

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年(“新闻

等等。


根据您的描述,空格不是可选的。但是根据您提供的示例,它们是可选的。哪一个是正确的? - Daniel Hilgarth
你的正则表达式是否无法匹配任何样本,或者它是否匹配所有样本? - Daniel Hilgarth
当前面的符号是:空格和[XxYy]{1,2},并且在点号后面的符号是:(空格和非大写字母符号和非数字),提取点号。 - stemm
我已经补充了主要问题的文本(附注)。 - stemm
2个回答

2
尝试从前瞻组中删除>符号:(?<=\s[XxYy]{1,2})\.(?=\s+?[^\p{javaUpperCase}\d])。您可以使用(?>x)(原子组)或(?=x)(零宽度正向前瞻),但不能使用(?>=x)
另外请注意,您的第二个示例与您的描述不匹配,并且不会与上述正则表达式匹配。

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

谢谢指出。人们总是热衷于使用前/后向查找来复杂化事情,即使这并不必要。 - Ingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接