C# 前缀/非前缀字符串的正则表达式
我试图通过检测一个标记来对XML字符串执行转换,该标记始终如下所示:C# 前缀/非前缀字符串的正则表达式,c#,regex,C#,Regex,我试图通过检测一个标记来对XML字符串执行转换,该标记始终如下所示: <attr name="firstName" /> <attr name="Name" /> <attr name="lastName" /> 我希望捕获它并用后缀替换它本身,因此我将得到以下结果: <attr name="firstName" /><attr name="beep" /> <attr name="Name" /><attr n
<attr name="firstName" />
<attr name="Name" />
<attr name="lastName" />
我希望捕获它并用后缀替换它本身,因此我将得到以下结果:
<attr name="firstName" /><attr name="beep" />
<attr name="Name" /><attr name="beep" />
但如果这是最后一次,我希望什么都不做
<attr name="lastName" />
我正在尝试这种检测模式
Regex.Replace(before, "(<attr name=\"[first]*name\" />)", "[0]<attr name=\"beep\" />");
Regex.Replace(在“()”、“[0]”之前);
但这将匹配第一个的所有排列。如何最多表达一个确切的字符串“first”?Regex.Replace(在“()”之前,“$0”);
将
*
替换为?
将搜索一个或零个事件。我建议使用负前瞻:
Regex.Replace(before, "(<attr name=\"(?!last)[^\"]*Name\" />)", "$0<attr name=\"beep\" />");
Regex.Replace(在“(我想你想要的是:
Regex.Replace(before, "(<attr name=\"(?:first)?name\" />)", "$0<attr name=\"beep\" />");
Regex.Replace(在“()”之前,“$0”);
[first]
在正则表达式中表示“任何字符f
,i
,r
,s
或t
”
(?:first)
说“字符串first
,被视为一个(非捕获)组”。?
然后说前面的匹配应该零次或一次出现。XML
和RegEx
不是一个好的组合。我认为RegEx和任何东西都是。但是你能做什么…)您的问题有点不清楚(或者您的目标是)。您是想添加
位,还是只是想用字符串本身替换所查找的字符串(这似乎是毫无意义的尝试)?在我看来,您提出的更改将破坏XML。为什么不想想如何使用XML解析器来实现这一点,而不是用一些无法理解的正则表达式来打开您的脑袋?输入错误。应该是
@CRMconfusee-如果您决定走这条路-您使用$number
引用捕获组。我不知道你从哪里得到[0]
from。但我同意其他人的看法-最好使用XML解析器。@Damien_The_unsiver Right,在关于模式的部分。@CRMconfusee-那么你是在访问匹配集
还是在传递一个toRegex.Replace
?嗯…主要是我在尝试做正确的事情时感到困惑,呵呵。多亏了在大家的提示下,我意识到我应该是$1而不是[0]。所以现在唯一的问题是我想匹配“first”一次或零次(与“first”的任何排列方式相反)。+1是迄今为止最好的匹配方式。假设我们可以省略lastName“risk”-我如何匹配确切字符串*first(不是它的排列方式)的替换项准确地说是一次还是零次?
Regex.Replace(before, "(<attr name=\"(?:first)?Name\" />)", "$0<attr name=\"beep\" />");
Regex.Replace(before, "(<attr name=\"(?:first)?name\" />)", "$0<attr name=\"beep\" />");