Java 使用正则表达式匹配非单词字符但不匹配笑脸

Java 使用正则表达式匹配非单词字符但不匹配笑脸,java,regex,regex-negation,lookahead,Java,Regex,Regex Negation,Lookahead,我有一个Java程序,它应该从字符串中删除所有非字母字符,除非它们是笑脸,例如=)或=]或:p 用[a-zA-Z]|=\)\124;=\]\ 124;:p来匹配相反的词很容易,但我不知道如何否定这个表达式。因为我使用的是String.replaceAll()函数,所以它必须是否定形式 我相信问题的一部分可能来自这样一个事实:微笑通常有两个字符长,而我一次只匹配一个字符 有趣的是,replaceAll(“(?![Tt])[Oo]”,“)删除了字母O的每一次出现,即使是在单词“to”中。这是否意味着

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

[a-zA-Z]|=\)\124;=\]\ 124;:p来匹配相反的词很容易,但我不知道如何否定这个表达式。因为我使用的是String.replaceAll()函数,所以它必须是否定形式

我相信问题的一部分可能来自这样一个事实:微笑通常有两个字符长,而我一次只匹配一个字符

有趣的是,
replaceAll(“(?![Tt])[Oo]”,“)
删除了字母O的每一次出现,即使是在单词“to”中。这是否意味着我的replaceAll函数不理解regex lookahead?它不会抛出任何错误

我最终使用了

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

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

编辑:显然,我没有彻底测试我的原始正则表达式,您还需要在
之后进行反向查找,以确保您使用的字符不是笑脸中的第二个字符:

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

有趣!注意:-)和>:^}超过2个字符。:)这是一个巨魔吗?我确实包括了“一般”这个词"TrueWill的陈述似乎是真实的,对我来说不是troll。为什么要在简单的模式匹配上使用正则表达式呢?只需构建一个smilies表,并遍历字符串中的字符。在该索引中针对可能的smilies进行测试。如果不是,则删除它。如果是,则跳过那么多字符。重复。我不打算使用troll。我确实+1了这个问题,但想要ed注意到它是开放式的,除非你准确地定义了“笑脸”是什么。例如,请参见“测试]=):P不要(失败)!”变成“Testing==:P dont fail”,我还用了一组额外的括号(?!([a-zA-Z]|=)|=]|:P)试过了。有趣的是,replaceAll((?![Tt])[Oo],“”)删除了字母O的每一次出现,即使是在单词“to”中。这是否意味着我的replaceAll函数不理解regex lookahead?它不会扔任何东西errors@Kevin-我刚刚编辑了我的答案,现在应该可以正常工作了,很抱歉。上面的正则表达式替换每一次出现的O的原因是,前瞻不使用任何字符,因此可以将正则表达式描述为“如果下一个字符不是T,而是O,则匹配”。如果要匹配前面没有T的每个O,则应使用负查找:
(?(“如果前一个字符不是T,则匹配,下一个字符是O”)。这很有意义,我的想法不正确。感谢您的解释。
[:=][\(\)\[\]]
  ^    ^-----mouth
  |--eyes