在Java中使用正则表达式有选择地查找模式

在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

我有一个字符串列表(在本例中是来自Twitter的tweets)。这些字符串由用户发布,有时引用其他特定用户。我使用正则表达式和Java的String.replaceAll(pattern,replace)方法来替换语音中常见问题的实例(在本例中为重复辅音),但我需要一种方法使其忽略在用户名中找到的任何模式。用户名模式与regex
\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支持的可变长度查找。今天学到了一些新东西:)