【问题标题】:How to upper case a regular expressions pattern?如何大写正则表达式模式?
【发布时间】:2011-05-28 00:06:51
【问题描述】:

我目前正在研究一个高度利用正则表达式的项目。输入字符串已经大写,因此设置了正则表达式 IgnoreCase 标志。内部的 MS RegEx 引擎随后将所有大小写更改回较低的值,这是不必要的打击。将 reg 表达式模式更改为大写并删除标志有助于提高性能。

有谁知道算法库可以大写 Reg ex 模式而不影响组名或转义字符?

【问题讨论】:

  • ToUpper() 在您的模式字符串上。这不应该影响特殊字符。
  • 恐怕是可以的,比如\w或者\s在ToUpper()-ed的时候意义就大不一样了
  • 肯定会影响特殊字符:\s\S不一样。您可能必须自己解析正则表达式。可惜这么多语言并没有在结构上暴露正则表达式,而只是序列化成字符串或者不透明的对象。
  • ++ 到上述 cmets 并且:您是否对您的 RegEx 应该匹配/不匹配的内容进行了测试?否则,无论您采用何种 RegEx 转换方法,都存在引入回归的风险。
  • 我已经有了一组基于大量输入(1000 秒)的基准测试结果。我可以将这些与通过更改正则表达式获得的任何结果进行比较

标签: c# regex


【解决方案1】:

你可以去搜索前面没有奇数个反斜杠的小写字母:

(?<!(?<!\\)(?:\\\\)*\\)\p{Ll}+

然后将匹配传递给MatchEvaluator,将其大写并替换原始字符串中的文本。我不懂 C#,所以这可能无法立即工作(代码 sn-p 从RegexBuddy 中获取并稍作修改),但这是一个开始:

string resultString = null;
resultString = Regex.Replace(subjectString, 
    @"(?<!                 # Negative lookbehind:
       (?<!\\)(?:\\\\)*\\  # Is there no odd number of backslashes
      |                    # nor
       \(\?<?\p{L}*        # (?<tags or (?modifiers
      )                    # before the current position?
      \p{Ll}+              # Then match one or more letters", 
    new MatchEvaluator(ComputeReplacement), RegexOptions.IgnorePatternWhitespace);

public String ComputeReplacement(Match m) {
    // You can vary the replacement text for each match on-the-fly
    return @"\0".ToUpper();  // or whatever is needed for uppercasing in .NET
}

说明:

(?<!        # assert that the string before the current position doesn't match:
 (?<!\\)    # assert that we start at the first backslash in the series
 (?:\\\\)*  # match an even number of backslashes
 \\         # match one backslash
)
\p{Ll}+     # now match any sequence of lowercase letters

【讨论】:

  • 还有一件事:这个正则表达式会改变像(?s) 这样的就地修饰符,我怀疑(?S) 不能正常工作。因此,如果您的正则表达式中有这些,则可能需要更改此方法。它还会产生带有 Unicode 属性的不良结果,例如 \p{Ll}...
  • 这不是大写任何组名吗?我有一个限制,即 中的任何现有组名仍必须保持与已设置相同的大小写。
  • 是的,它会的。不过,应该可以解释这一点。等一等;我将编辑我的答案。
猜你喜欢
  • 2020-11-06
  • 2014-11-28
  • 2012-02-12
  • 2011-02-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多