【问题标题】:right square bracket in regex, can't be escaped?正则表达式中的右方括号,不能转义?
【发布时间】:2014-07-11 11:38:28
【问题描述】:

我正在使用 clish 和正则表达式进行参数输入。 http://clish.sourceforge.net/clish-0.7.3/group__clish__ptype.html

我正在将这样的字符列入白名单:

 pattern="[a-zA-Z0-9\!\[\£\$\%\/\^\_\+\=\#\@\;\,\|\*\{\}\(\)\~\.\>\<\&\-]+"

这很好用,我可以输入任何指定的字符。但是,如果我添加 \]\\] 来转义右方括号,这将不起作用。它与[ 匹配,因此无法输入,] 之后的任何内容都无法输入。任何想法如何转义它以便输入 ] 作为有效字符? [ 工作正常。

【问题讨论】:

  • 尝试使用此工具调试:regex101.com
  • 它不工作,但它在做什么呢?是抛出错误,还是匹配错误的东西,还是......?
  • >\<\& ?为什么需要将它们转义为 html 实体?
  • 关于您的正则表达式的严重不相关问题是[] 一次只匹配一个字符,而不是&,即 5。
  • 可能值得更改模式中项目的顺序,看看是否会有所不同。我会试试这个:"[-\]\.\^\\![$%/£+=#@;,|*{}()~<>&\w]+",编码将其转换为有效 XML 所需的最小值。这种模式也比您拥有的模式更简单,因为它删除了一些不需要的转义并使用 \w 而不是 a-zA-Z0-9。

标签: regex clish


【解决方案1】:

试试这个模式

pattern="[][a-zA-Z0-9!£$%/^_+=#@;,|*{}()~.&-]+"

文字右方括号必须位于字符类的第一个位置,以避免与关闭字符类的右方括号产生歧义(因为不允许空字符类)。您可以将左方括号放在您想要的任何位置(显然不是在第一个位置,或者在- 之后)

【讨论】:

  • 但这只是因为整个正则表达式都在一个字符串中。如果我理解正确的话,这个“clish”是某种 XML 格式,所以 [ 和 ] 并不特殊,\.
  • {1,} 而不是+ 有什么意义?我错过了什么很酷的东西吗?
  • @Paul:在大多数正则表达式风格中,所有特殊的正则表达式字符在它们位于字符类并且不需要转义时都会失去特殊含义。但是也有像]-^这样的例外。在其他风格中,您可以转义这些特殊字符,但在 POSIX 中似乎并非如此。
  • @Paul:它不是一个空字符类。这是一个字符类,其中第一个字符是]。如果您想了解有关此语法的更多信息,可以查看此处:stackoverflow.com/questions/17845014/what-does-the-regex-mean/…
  • @Paul:之所以有效,是因为需要的字符包含在#-';-@范围内,看看ascii表就明白了。
【解决方案2】:

试试这个:

.*[~!@#$%^&*()_+-={}|\\\]\[:";'<>?,./].*

验证正则表达式Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2015-11-09
    • 2021-08-20
    相关资源
    最近更新 更多