在Java中使用正则表达式有选择地查找模式
我有一个字符串列表(在本例中是来自Twitter的tweets)。这些字符串由用户发布,有时引用其他特定用户。我使用正则表达式和Java的String.replaceAll(pattern,replace)方法来替换语音中常见问题的实例(在本例中为重复辅音),但我需要一种方法使其忽略在用户名中找到的任何模式。用户名模式与regex在Java中使用正则表达式有选择地查找模式,java,regex,twitter,pattern-matching,Java,Regex,Twitter,Pattern Matching,我有一个字符串列表(在本例中是来自Twitter的tweets)。这些字符串由用户发布,有时引用其他特定用户。我使用正则表达式和Java的String.replaceAll(pattern,replace)方法来替换语音中常见问题的实例(在本例中为重复辅音),但我需要一种方法使其忽略在用户名中找到的任何模式。用户名模式与regex\b@\S+\b 所以我想匹配y+,但不是作为任何匹配\b@\S+\b 所以在everybodyy@everybodyy中,我将匹配ever(y)bod(yy)@eve
\b@\S+\b
所以我想匹配y+
,但不是作为任何匹配\b@\S+\b
所以在everybodyy@everybodyy
中,我将匹配ever(y)bod(yy)@everybodyy ever(y)bod(yy)
这可能吗?我该如何做?text.replaceAll((?I)(?尝试以下操作:
String regEx = "(\\s+[^@\\s]\\S*y+\\S*)|(^[^@\\s]\\S*y+\\S*)";
我不确定用一个简单的regexp就可以解决这个问题。我的方法是找到用户名在输入字符串中的位置,然后只扫描它们周围的字符串部分。或者,你可以做如下操作:查找(\b@\S+\b)|(y+)的匹配项
,然后迭代匹配,并根据是否找到捕获组1
或2
来确定如何处理这些匹配。也就是说,您必须使用匹配器,而不是replaceAll()
。问题是正则表达式引擎通常不支持可变长度查找,这是检查y
是否由\b@\S+
执行所必需的。(?@user2149140,我建议您将其作为答案发布并接受,以便问题得到回答。+1我不知道Java支持的可变长度查找。今天学到了一些新东西:)