【问题标题】:Regex to identify escaped characters issue正则表达式识别转义字符问题
【发布时间】:2015-09-18 18:26:02
【问题描述】:

假设我们有以下字符串:

@"Hello m\u00e9 name is Mat\u00bfQu"

我正在使用正则表达式:

private static readonly Regex ESCAPING_REGEX = new Regex("\\+[^\"][a-zA-Z0-9]*", RegexOptions.Compiled);

但是,这个正则表达式似乎没有返回任何匹配项:

MatchCollection matches = ESCAPING_REGEX.Matches(text);
// matches.Count == 0

我在Regex101 上尝试了正则表达式,它确实返回了我正在寻找的两个匹配项。

如何修复我的正则表达式以实现预期的行为? (我们很乐意接受任何改进建议。)

【问题讨论】:

  • 你的字符串是逐字格式的吗?
  • @CasimiretHippolyte 很抱歉我的无知。什么是逐字格式?
  • @CasimiretHippolyte 哦,我明白了!我的字符串确实是逐字格式的。我将更新我的问题以反映这一点。我尝试逐字删除,但仍然没有匹配项
  • 也尝试为您的模式使用逐字字符串。

标签: c# .net regex unicode escaping


【解决方案1】:

您的正则表达式声明有问题,因为您需要在匹配的开头使用文字 +。看看你的正则表达式对于正则表达式引擎的样子:

  • \+ - 匹配文字 +
  • [^"] - 匹配除" 以外的任何字符
  • [a-zA-Z0-9]* - 匹配 0 个或多个数字或拉丁字母字符。

如果您使用逐字字符串文字来创建您的正则表达式,例如

Regex.Matches(str, @"\\+[^""][a-zA-Z0-9]*");

你会得到 2 场比赛。逐字字符串文字中的\\ 将匹配文字\,而+ 将被视为量词。

实际上,您甚至不需要+(因为它会匹配\\\\)和[^""](除非在\ 之后可以有一些"s,这不是您想要的匹配),你可以使用

@"\\[a-zA-Z0-9]+"

匹配您的子字符串(\\ 匹配 \[a-zA-Z0-9]+ 将匹配该范围内的 1 个或多个字符)。

【讨论】:

猜你喜欢
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2010-12-22
  • 2010-09-21
相关资源
最近更新 更多