匹配所有特定重复单词的正则表达式

3

我有一个字符串,可能长这样:

SELECT * FROM blah WHERE ID IN ('<replaced>', '<replaced>', '<replaced>')

<replaced>”是一个字符串,我想匹配在()之间的所有内容,以便用“<replacedlist>”替换它。

结果字符串将会是:

SELECT * FROM blah WHERE ID IN (<replacedList>)

我不希望只是在括号内执行所有操作,因为这将匹配其他字符串,仅当括号包含“<replaced>”并且重复任意次数时才匹配。

如果相关的话,我将使用C#进行解析,但我不会标记它,因为这应该是通用的正则表达式。


内置于C#中的?不确定是否需要更多信息? - Martin
这个想法是将多个<替换>连接成一个...所以只要它们彼此相邻,就可以替换它们。 - Martin
@Martin:好的 - 我只是问一下,因为它们在语法和处理方面都有微小的差异。 - O. R. Mapper
\(\.\*\) 模式可以吗?即只匹配括号内的所有内容,并将其替换为 <replacedList> - Adam Stelmaszczyk
@AdamStelmaszczyk,不,可能会有其他的()组合,这些组合不应该被替换。 - Martin
显示剩余4条评论
1个回答

2
您可以使用这个模式:
(?<=\([^)]*)'<replaced>'(, '<replaced>')*(?=[^)]*\))

如同

var input = "SELECT * FROM blah WHERE ID IN ('<replaced>', '<replaced>', '<replaced>')";
var pattern = @"(?<=\([^)]*)'<replaced>'(, '<replaced>')*(?=[^)]*\))";
var output = Regex.Replace(input, pattern, "<replacedList>");

Console.WriteLine(output); // SELECT * FROM blah WHERE ID IN (<replacedList>)

或者,您可以使用以下模式:

(\([^)]*?)(<replaced>(?:, <replaced>)*)([^)]*\))

如下所示:

var input = "SELECT * FROM blah WHERE ID IN ('<replaced>', '<replaced>', '<replaced>')";
var pattern = @"(\([^)]*?)('<replaced>'(?:, '<replaced>')*)([^)]*\))";
var output = Regex.Replace(input, pattern, "$1<replacedList>$3");

Console.WriteLine(output); // SELECT * FROM blah WHERE ID IN (<replacedList>)

这似乎不起作用...每个<replaced>都被<replacedlist>覆盖了,我想要将它们连接起来。 - Martin
@Martin 我用了那段代码并得到了正确的结果。我猜 <replaced> 只是一个占位符,代表你真正想要替换的内容,但也许它无法处理真实的值。你实际上想要替换什么? - p.s.w.g
那是实际值,一个脱敏脚本用那个替换了ID,我想将它们连接起来以便分组。我会在控制台中尝试一下,看看是否有所不同。 - Martin
@Martin,你能否上传一下你正在使用的执行替换操作的代码? - p.s.w.g
我的错,实际上文本是 '<replaced>',即用单引号括起来。 - Martin
@Martin 那么结果应该是'<replacedList>'还是<replacedList>--也就是说,带有单引号还是不带? - p.s.w.g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接