【问题标题】:Which character(s) can I safely use to express custom meaning in regular expression我可以安全地使用哪些字符在正则表达式中表达自定义含义
【发布时间】:2012-10-01 17:10:58
【问题描述】:

我的应用程序中的用户将使用正则表达式来指定应用程序应采用哪些文件以及应排除哪些文件,例如包含匹配foo.*\.txt的文件

但有时过滤器需要使用只有应用程序在运行时才能知道的值。例如,如果过滤器是foo[SPECIALVALUEHERE].*\.txt,而特殊值恰好是bar,那么实际过滤器将是foobar.*\.txt

哪些字符可用于指定 [SPECIALVALUEHERE]?我想为了避免歧义,它不需要是正则表达式中的特殊/保留字符,也不是文件中会出现的字符。客户的另一个要求是它只能是一个(或最多两个或三个)字符,因此不能使用 %SPECIALVALUE% 之类的内容。

我可以为此目的使用哪个字符或字符组合的任何建议。

【问题讨论】:

    标签: regex windows language-agnostic filesystems


    【解决方案1】:

    在 Windows 上,您可以使用例如 =,它不是正则表达式中的特殊字符,但不允许在文件名中使用 (here a table of characters that can't be used in windows filenames)。然后,您可以将 = 替换为您需要的内容。

    否则在 unix 系统上会很混乱,因为任何字节序列都可以不受限制地成为文件名的一部分,here a reference question on serverfault,因此,即使语言不可知,您至少应该决定要使用哪个系统正则表达式。

    【讨论】:

    • 那么你可以使用= :) 它不是一个正则表达式字符(在正则表达式中使用它是可以的)并且它不允许在文件名中,因此你赢了'在任何文件名中都找不到它(如果这是您要求的,我开始怀疑)
    • 你是对的,这就是我要找的。谢谢。不知道还有没有其他角色?
    • 我链接了一个页面(这里是一个字符表...),它应该向您显示文件名中不允许的字符列表。如果这些字符不在@raina77ow 提供的特殊字符列表中,您可以使用它们。但是,如果您需要使用多个特殊值并且这些值没有相互关联,您可以将= 用于第一个,将== 用于第二个。只要记住在=之前替换==,否则你的==将被替换为两个单独的=
    【解决方案2】:

    在正则表达式(字符类之外)中只有 12 个具有特殊含义的符号应该被转义:

    • 单字符:.
    • 字符串开始/结束锚点:^ $
    • 量词:+ * ?
    • 捕获组分隔符:( )
    • 量词开头分隔符:{
    • 字符类开头分隔符:[
    • 交替符号:|
    • 以及最后一个转义符号本身:\

    要转义它们(=特殊含义的条带),只需在它们前面加上 \ 符号。要分隔正则表达式的特殊部分,您可以使用任何非特殊和非字母数字符号:立即想到 #~。 )

    作为旁注,在 Perl 中,您可以使用 \Q...\E 运算符自动引用正则表达式的一部分。

    【讨论】:

    • 嗯,我觉得这完全是另一个问题的正确答案?
    【解决方案3】:

    我在这类事情上使用了双大括号。我使用的任何正则表达式方言都不能识别花括号内的任何内容,因此它不是正则表达式中的有效字符串。 foo{{SPECIALVALUEHERE}}\.txt

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 2021-10-26
      • 1970-01-01
      • 2011-07-25
      • 2016-03-31
      • 2020-11-12
      相关资源
      最近更新 更多