3

我有一个 Java 程序,它应该从字符串中删除所有非字母字符,除非它们是笑脸,例如 =) 或 =] 或 :P

很容易匹配相反的内容,[a-zA-Z ]|=\)|=\]|:P但我不知道如何否定这个表达式。由于我使用的是 String.replaceAll() 函数,因此它必须采用否定形式。

我相信部分问题可能来自微笑通常有 2 个字符长,而我一次只匹配 1 个字符?

有趣的是,replaceAll("(?![Tt])[Oo]","")它删除了所有出现的字母 O,即使是在单词“to”中。这是否意味着我的 replaceAll 函数不理解正则表达式前瞻?它不会抛出任何错误......

我最终使用

replaceAll("(?<![=:;])[\\]\\[\\(\\)\\/]","")
.replaceAll("[=:;](?![\\]\\[\\(\\)o0OpPxX\\/])","")
.replaceAll("[^a-zA-Z=:;\\(\\)\\[\\]\\/ ]","")

这非常混乱,但效果很好。The... quick! (brown) fox jump's over the[] lazy dog. :] =O ;X变成THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG :] =O ;X

编辑:忽略该修复,请参阅下面接受的答案。

4

1 回答 1

4

使用负前瞻应该很容易做到这一点。基本上,匹配将在组内正则表达式匹配的任何位置失败(?!...).如果前瞻不匹配(意味着下一个字符是不属于笑脸的非字母字符),则应使用单个通配符 ( ) 跟随否定前瞻来使用字符。

编辑:显然,我没有非常彻底地测试我的原始正则表达式,您还需要在后面进行负面回顾,.以确保您使用的角色不是笑脸中的第二个角色:

(?![a-zA-Z ]|=\)|=\]|:P).(?<!=\)|=\]|:P)

请注意,您可以通过使用眼睛和嘴巴的字符类来缩短正则表达式,例如:

[:=][\(\)\[\]]
  ^    ^-----mouth
  |--eyes
于 2011-09-19T01:33:26.713 回答