【问题标题】:Regular expression to allow backslash in C#在 C# 中允许反斜杠的正则表达式
【发布时间】:2013-02-01 07:04:22
【问题描述】:

任何人都可以为我提供正则表达式来验证字符串,它只允许除反斜杠之外的任何特殊字符。我试过了

var regexItem = new Regex("^[a-zA-Z0-9\\\ ]*$");

但它似乎不起作用

【问题讨论】:

  • “似乎不起作用”是什么意思?它做了什么你没想到的?

标签: c# regex


【解决方案1】:

反斜杠需要在正则表达式中进行转义 - 它们需要在 C# 中进行转义,除非您使用 verbatim string literals。因此,其中任何一个都应该起作用:

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$");
var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$");

这两者都确保将以下字符串内容传递给Regex 构造函数:

^[a-zA-Z0-9\\ ]*$

Regex 代码随后将看到双反斜杠并将其视为“我真的想匹配反斜杠字符。”

基本上,您总是需要区分“要传递给正则表达式引擎的字符串内容”和“源代码中的字符串文字表示”。 (当然,这不仅适用于正则表达式。调试器不会通过在 Watch 窗口等中转义来提供帮助。)

编辑:现在问题已被编辑以显示您最初有 三个 反斜杠,这只是无效的 C#。我怀疑您的目标是“包含三个反斜杠的字符串”,这可能是以下任何一种:

var regexItem = new Regex(@"^[a-zA-Z0-9\\\ ]*$");
var regexItem = new Regex("^[a-zA-Z0-9\\\\\\ ]*$");

...但就正则表达式而言,您不需要转义空格。

【讨论】:

  • 请注意,没有任何内容传递给 Regex ctor,因为代码无法编译。
  • @DanielHilgarth:在您编辑之前编译的问题中显示的代码。 (当我回答问题时,问题显示了两个反斜杠。不是代码风格,我知道降价有三个反斜杠,但我正在回答我看到的问题:)
  • 我只是格式化了代码。请查看原始修订的来源。三个反斜杠从一开始就存在。
  • @DanielHilgarth 出于某种原因,这个问题看起来好像一开始只有两个反斜杠。第三个只有在您格式化后才能正确显示。
  • @DanielHilgarth:是的,我正在编辑我的评论。它们出现在降价中,但我正在回答显示的问题:)
【解决方案2】:

您要么需要双重转义它(一次用于 C#,一次用于正则表达式引擎):

var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$");

或者你可以使用C#的verbatim string feature(注意@):

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$");

在逐字字符串中,反斜杠不会被解释为开始转义序列,因此您只需为 Regex 引擎转义一次。

我假设您当前的代码无法编译。它应该说类似于“无法识别的转义序列”。
原因是您有三个反斜杠,后跟一个空格。前两个反斜杠被解释为表示反斜杠的转义序列,但第三个反斜杠被解释为以空格作为第二个字符的转义序列的开头。不存在这样的转义序列,导致错误。

【讨论】:

    【解决方案3】:

    您必须通过添加 4 \s 以匹配单个 \ 来转义正则表达式的 \ 以及 C# 字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2014-06-14
      • 1970-01-01
      相关资源
      最近更新 更多