4

我有一些形式的字符串

string strA = "Cmd:param1:'C:\\SomePath\SomeFileName.ext':param2";
string strB = "Cmd:'C:\\SomePath\SomeFileName.ext':param2:param3";

我想在 ':' 上拆分这个字符串,这样我就可以提取 N 个参数。一些参数可以包含[明确]显示的文件路径,我不想拆分括号内的':'。我可以用正则表达式来做到这一点,但我对如何让正则表达式只有在冒号两边都没有“'”时才拆分感到困惑。

我尝试过

string regex = @"(?<!'):(?!')"; 
string regex = @"(?<!'(?=')):";

仅当左侧没有“'”且右侧没有“'”时才继续匹配(向后/向前看负),但这仍然在 'C:\SomePath\SomeFileName.ext' 中包含的冒号上拆分。

我怎样才能修改这个正则表达式来做我需要的?

谢谢你的时间。


注意:我发现以下正则表达式有效。但是,我想知道是否有更好的方法来做到这一点?

string regex = @"(?<!.*'.*):|:(?!.*'.*)";
4

4 回答 4

2

考虑这种方法:

var guid = Guid.NewGuid().ToString();
var r = Regex.Replace(strA, @"'.*'", m =>
{
    return m.Value.Replace(":", guid);
})
.Split(':')
.Select(s => s.Replace(guid, ":"))
.ToList();
于 2013-07-30T11:56:10.667 回答
1

您可以构建一个正则表达式来匹配字段本身并获取该正则表达式的匹配集,而不是尝试构建一个后向正则表达式来拆分。例如,一个字段要么是一个引用的非引号序列(即可以包含:),要么它不能包含分隔符:

string regex = "'[^']*'|[^':]*";
var result = Regex.Matches(strA, regex);
于 2013-07-30T11:57:51.843 回答
1

您想拆分(?<!\b[a-z]):(?!\\)(使用RegexOptions.IgnoreCase)。

于 2013-07-30T12:00:00.797 回答
1

不那么漂亮,但您可以用安全字符替换,然后在拆分后将:\它们返回。:\

string[] param = strA.Replace(@":\", "|||").Split(':').Select(x => x.Replace("|||", @":\")).ToArray();
于 2013-07-30T12:02:38.537 回答