正则表达式,如果在单引号或双引号内,则不分割字符串

时间:2012-09-20 19:23:18

标签: c# .net regex

我在C#中有一个带有以下模式的正则表达式

Regex param = new Regex(@"^-|^/|=|:");

基本上,它用于命令行解析。

如果我通过下面的cmd线args,它也会显示C:

/Data:SomeData /File:"C:\Somelocation"

如何使其不适用于双引号或单引号内的字符?

2 个答案:

答案 0 :(得分:2)

您可以分两步完成此操作:

使用第一个正则表达式

Regex args = new Regex("[/-](?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");

将字符串拆分为不同的参数。然后使用正则表达式

Regex param = new Regex("[=:](?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");

将每个参数拆分为参数/值对。

<强>解释

[=:]      # Split on this regex...
(?=       # ...only if the following matches afterwards:
 (?:      # The following group...
  [^"]*"  #  any number of non-quote character, then one quote
  [^"]*"  #  repeat, to ensure even number of quotes
 )*       # ...repeated any number of times, including zero,
 [^"]*    # followed by any number of non-quotes
 $        # until the end of the string.
)         # End of lookahead.

基本上,如果前面有偶数引号,它会在字符串中向前看。如果有,我们就在一个字符串之外。但是,这个(有些可管理的)正则表达式只处理双引号,并且只有在那些内部没有转义引号的情况下。

以下正则表达式正确处理单引号和双引号,包括转义引号。但我想你会同意,如果有人在生产代码中找到这个,我保证在The Daily WTF上有一篇专题文章:

Regex param = new Regex(
    @"[=:]
    (?=      # Assert even number of (relevant) single quotes, looking ahead:
     (?:
      (?:\\.|""(?:\\.|[^""\\])*""|[^\\'""])*
      '
      (?:\\.|""(?:\\.|[^""'\\])*""|[^\\'])*
      '
     )*
     (?:\\.|""(?:\\.|[^""\\])*""|[^\\'])*
     $
    )
    (?=      # Assert even number of (relevant) double quotes, looking ahead:
     (?:
      (?:\\.|'(?:\\.|[^'\\])*'|[^\\'""])*
      ""
      (?:\\.|'(?:\\.|[^'""\\])*'|[^\\""])*
      ""
     )*
     (?:\\.|'(?:\\.|[^'\\])*'|[^\\""])*
     $
    )", 
    RegexOptions.IgnorePatternWhitespace);

对这个怪物的进一步解释here

答案 1 :(得分:0)

您应该阅读“Mastering Regular Expressions”以了解为什么没有针对您的问题的一般解决方案。正则表达式无法处理任意深度。一旦你开始逃脱逃脱角色或逃脱逃脱角色的逃脱或......你就迷失了。您的用例需要解析器而不是正则表达式。