简单的正则表达式Befuddlement

时间:2013-07-30 11:40:30

标签: c# regex

我有一些形式的字符串

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中包含的冒号上。分机”。

如何根据需要修改此正则表达式?

感谢您的时间。


注意:我发现以下正则表达式。但是,我想知道是否有更好的方法吗?

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

4 个答案:

答案 0 :(得分:2)

考虑这种方法:

var guid = Guid.NewGuid().ToString();
var r = Regex.Replace(strA, @"'.*'", m =>
{
    return m.Value.Replace(":", guid);
})
.Split(':')
.Select(s => s.Replace(guid, ":"))
.ToList();

答案 1 :(得分:1)

您可以构建一个正则表达式来匹配字段本身并获取该正则表达式的匹配集,而不是尝试构建一个可以分割的外观正则表达式。 EG字段是带引号的非引号序列(即可以包含:),或者它不能包含分隔符:

string regex = "'[^']*'|[^':]*";
var result = Regex.Matches(strA, regex);

答案 2 :(得分:1)

您希望在(?<!\b[a-z]):(?!\\)上分开(使用RegexOptions.IgnoreCase)。

答案 3 :(得分:1)

不是很漂亮但你可以用安全字符替换:\,然后在拆分后将它们返回:\

string[] param = strA.Replace(@":\", "|||").Split(':').Select(x => x.Replace("|||", @":\")).ToArray();