1

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

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

usera,userb,,userc,,userd,usere,userf,

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

例如,考虑以下表达式:

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

这导致三个匹配:

用户,

用户,

用户,

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

如果我可以用任何语言编写代码,这将是微不足道的,但我仅限于输入目标字符串和模式,并且我需要一个匹配项,该匹配项包含除我省略的项之外的所有项。我不确定这是否可能,我用正则表达式所做的一切都涉及处理匹配集合中的多个项目。

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

在此处输入图像描述

EDIT1: 为了澄清这张票,专门用于解决仅使用正则表达式语法的用例。用代码解决这个问题是微不足道的,但考虑到执行代码是我不想逆向工程、包装或替换的第 3 方产品的一部分,因此只使用正则表达式解决它是必需的。

4

1 回答 1

2

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

不,正则表达式匹配是连续的。

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


话虽如此,您也可以匹配您不想保留的所有内容并将其删除,例如

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

http://rubular.com/r/LOKOg6IeBa

于 2013-01-22T21:11:16.743 回答