Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 前缀/非前缀字符串的正则表达式_C#_Regex - Fatal编程技术网

C# 前缀/非前缀字符串的正则表达式

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

我试图通过检测一个标记来对XML字符串执行转换,该标记始终如下所示:

<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-那么你是在访问
匹配集
还是在传递一个to
Regex.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\" />");