Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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,我使用标签的形式 [[MyTag]]Some Text[[/MyTag]] 为了在全文中找到这些标记,我使用以下表达式(此处与此问题无关,但仅供参考): MYSEARCHTEXT是一个单词或短语,在本例中需要查找3次。我有一个想法可以简化此过程。使用以下正则表达式匹配标记的文本: \[.+?\][^\[\]]*?MYSEARCHTEXT[^\[\]]*?\[.+?\]\] 然后在保留捕获的组的字符串中替换MYSEARCHTEXT。这是否可行?如果我正确理解了这个问题,这将在您的标记之外匹配M

我使用标签的形式

[[MyTag]]Some Text[[/MyTag]]
为了在全文中找到这些标记,我使用以下表达式(此处与此问题无关,但仅供参考):


MYSEARCHTEXT是一个单词或短语,在本例中需要查找3次。

我有一个想法可以简化此过程。使用以下正则表达式匹配标记的文本:

\[.+?\][^\[\]]*?MYSEARCHTEXT[^\[\]]*?\[.+?\]\]

然后在保留捕获的组的字符串中替换
MYSEARCHTEXT

这是否可行?如果我正确理解了这个问题,这将在您的标记之外匹配MYSEARCHTEXT,并且您的匹配将在组中。这使用


您可以使用以下解决方案,该解决方案在
Regex.Replace
方法中使用您的模式版本,其中匹配计算器用作替换参数:

var pat = @"(?s)(\[\[(\w+)]].*?\[\[/\2]])|MYSEARCHTEXT";
var s = "[[Tag1]]Here I don't want to replace MYSEARCHTEXT[[/Tag1]]\nBut here MYSEARCHTEXT (1) should be replaced. And here MYSEARCHTEXT (2) needs to be replaced too.\n[[AnotherTag]]Here I don't want to replace MYSEARCHTEXT[[/AnotherTag]]\nAnd here I need to replace MYSEARCHTEXT (3) also.";
var res = Regex.Replace(s, pat, m =>
            m.Groups[1].Success ? m.Groups[1].Value : "NEW_VALUE");
Console.WriteLine(res);

结果:

[[Tag1]]Here I don't want to replace MYSEARCHTEXT[[/Tag1]]
But here NEW_VALUE (1) should be replaced. And here NEW_VALUE (2) needs to be replaced too.
[[AnotherTag]]Here I don't want to replace MYSEARCHTEXT[[/AnotherTag]]
And here I need to replace NEW_VALUE (3) also.
图案细节

  • (?s)
    -a
    RegexOptions.Singleline
    内联修饰符选项(a
    现在匹配任何字符)
  • (\[\[(\w+)].*?\[\[/\2]])
    -第1组:
    • \[\[
      -a
      [[
      子字符串
    • (\w+)
      -第2组:一个或多个单词字符
    • ]
      -a
      ]
      子字符串
    • *?
      -任何0+字符,尽可能少
    • \[\[/
      -a
      [[[/
      子字符串
    • \2
      -与捕获到组2中的文本相同
    • ]
      -文本
      ]
      子字符串
  • |
    -或
  • MYSEARCHTEXT
    -需要替换的一些模式

当组1匹配(
m.Groups[1].Success?
)时,此值将被放回,否则新的\u值将插入到结果字符串中。

最好的方法是将两者分别作为正匹配进行匹配。
然后根据哪个替换和写回哪个
匹配。(有人已经发布了此解决方案,因此我不会复制它)

另一种选择是完全放弃这一点,对文本进行限定
以先行搜索文本的形式

这说明了如何以这种方式进行

var pat = @"(?s)MYSEARCHTEXT(?=(?:(?!\[\[/?\w+\]\]).)*?(?:\[\[\w+\]\]|$))";
var res = Regex.Replace(s, pat, "NEW_VALUE");
演示:

格式:

 (?s)                          # Dot-all modifier
 MYSEARCHTEXT
 (?=                           # Qualify the text with an assertion
      (?:                           # Get non-tag characters
           (?! \[\[ /? \w+ \]\] )        
           . 
      )*?
      (?:                           # Up to -
           \[\[ \w+ \]\]                 # An open tag
        |  $                             # or, end of string
      )
 )

和到底是什么?这些只是正则表达式组名。在本例中,“key”是组1,包含“Tag1”,而“keyvalue”是组2,包含“此处我不想替换MYSEARCHTEXT”。但是我需要MYSEARCHTEXT的所有匹配项,这些匹配项不在这些标记内(文本中可以有许多类似于此的标记,具有不同的键名)。请查看。您可以使用regex类循环遍历每个匹配项,然后对前一组中的剩余文本(以及另一个要匹配
MYSEARCHTEXT
的regex)执行所需操作。好吧,可能是我的错,我描述得不够清楚。我需要“MYSEARCHTEXT”的所有匹配项,它们不在自定义标记内。您的解决方案捕获标记之外的整个文本。标记可以有不同的名称,这就是为什么我发布了用于查找所有这些标记的案例的regex示例。我更新了最初的帖子,让它更清晰。啊,好吧,对不起,我没有正确理解。我编辑了我的答案!XD还没有,请看我对jjmcc的回答。差不多,但似乎您的匹配范围太广,它只抓住了(2)个。我们需要考虑的是,整个文本可以有很多不同标签名称的标签。这不是你原来的例子,我会研究一下。
[[Tag1]]Here I don't want to replace MYSEARCHTEXT[[/Tag1]]
But here NEW_VALUE (1) should be replaced. And here NEW_VALUE (2) needs to be replaced too.
[[AnotherTag]]Here I don't want to replace MYSEARCHTEXT[[/AnotherTag]]
And here I need to replace NEW_VALUE (3) also.
var pat = @"(?s)MYSEARCHTEXT(?=(?:(?!\[\[/?\w+\]\]).)*?(?:\[\[\w+\]\]|$))";
var res = Regex.Replace(s, pat, "NEW_VALUE");
 (?s)                          # Dot-all modifier
 MYSEARCHTEXT
 (?=                           # Qualify the text with an assertion
      (?:                           # Get non-tag characters
           (?! \[\[ /? \w+ \]\] )        
           . 
      )*?
      (?:                           # Up to -
           \[\[ \w+ \]\]                 # An open tag
        |  $                             # or, end of string
      )
 )