正则表达式 - 将所有匹配作为单个匹配返回

时间:2013-01-22 20:49:55

标签: java regex

我正在处理一段将正则表达式应用于字符串并返回第一个匹配项的代码。我无权修改代码以返回所有匹配项,也无法实现替代代码。

我有以下示例目标字符串:

  

用户A,用户B ,,用户C ,, userd,usere,userf,

这是从多个源连接的逗号分隔用户名列表,其中一些是空白的,在某些地方会产生两个逗号。我正在尝试编写一个正则表达式,它将返回除特定值之外的所有逗号分隔的用户名。

例如,请考虑以下表达式:

[^,]\w{1,},(?<!(userb|userc|userd),)
  

这导致三场比赛:

     

用户A,

     

usere,

     

userf,

有没有办法将这些结果作为单个匹配而不是匹配集合,例如一个匹配文本'usera,usere,userf,'?

如果我可以用任何语言编写代码,这将是微不足道的,但我仅限于输入目标字符串和模式,我需要一个包含所有项目的匹配项,除了我省略的项目。我不确定这是否可行,我用regex做的所有事情都涉及在匹配集合中处理多个项目。

这是Regex Coach的一个例子。这张图片显示我想要三个匹配,但我的要求是将文本放在一个匹配中,而不是三个单独的匹配。

enter image description here

EDIT1: 澄清此票证是专门用于解决仅使用正则表达式语法的用例。在代码中解决这个问题是微不足道的,但是只使用正则表达式来解决这个问题是因为执行代码是第三方产品的一部分,我不想进行逆向工程,换行或替换。

1 个答案:

答案 0 :(得分:2)

  

有没有办法将这些结果作为单个匹配而不是匹配集合,例如包含文字'usera,usere,userf,'

的单个匹配项

没有。正则表达式匹配是连续的。

正则表达式从头到尾匹配(子)字符串。你不能放弃中间部分,这不是正则表达式引擎的工作方式。但是你可以再次应用表达式来找到另一个匹配的子字符串(增量搜索 - 这就是Regex Coach所做的)。这将导致匹配集合。


话虽这么说,你也可以匹配你 想要保留并删除它的所有东西,例如。

,(?=[\s,]+)|(userb|userc|userd)[\s,]*

http://rubular.com/r/LOKOg6IeBa