如何使用RegEx解析__Underscore Delimited__值?

时间:2018-01-10 19:40:23

标签: c# regex

我有以下内容:

"test","test",__Test1__,__Test2__,test
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Test3" value="__Test3__"/>
    <add key="Test4" value="__Test4__"/>
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
</configuration>

我正在尝试这个RegEx:

        Regex regex = new Regex(@"(?<=__)(.*?)(?=__)");
        MatchCollection matches = regex.Matches(fileContent);

但是我得到了以下结果:

Test1
,
Test2
Test3
Test4

当我只期待

Test1
Test2
Test3
Test4

我做错了什么?

原始示例:

 "test","test",__Test1__,__Test2__,__test

应仅返回Test1Test2,不得逗号。

3 个答案:

答案 0 :(得分:2)

概述

由于您使用积极的外观和积极的外观,您只是断言那些匹配,但您不会消耗字符。由于您没有使用这些字符,因此该模式匹配__在字符串之前和之后的每个实例。

代码

要解决此问题,您只需使用捕获组的捕获值并删除lookbehind和lookahead。

See regex in use here

__(.*?)__

要访问该论坛,请使用Match.Groups property

foreach (Match match in matches)
{
    Console.WriteLine(match.Groups[1].Value);
}

答案 1 :(得分:1)

您的正则表达式也匹配__,__

你可以尝试:

__([^_]*)__

对我而言,这对您的样本起了作用。

答案 2 :(得分:0)

你可以这样试试;

var str = "__Test1__,__Test2__,__test";
Regex regex = new Regex(@"(?<=__)([^,]*?)(?=__)");
MatchCollection matches = regex.Matches(str);

Output:
test1
test2

comma使用否定字符类。

Demo