正则表达式 - 是否应该对连字符进行转义?

22 浏览
0 Comments

正则表达式 - 是否应该对连字符进行转义?

连字符是正则表达式中的特殊字符,比如,为了选择一个范围,我可以这样做:\n

[0-9A-F]

\n但是在方括号之外,它只是一个普通字符,对吗?我在几个在线正则表达式测试工具上进行了测试,发现连字符在方括号之外(甚至在方括号内,如果它不处于两个字符之间 - 例如[-g]似乎匹配-或g)时,无论是否转义,都像普通字符一样工作。我找不到答案,但我想知道是否习惯转义连字符。

0
0 Comments

正则表达式中的连字符“-”在匹配字符集时需要进行转义吗?这个问题的出现是因为有人对连字符在字符集中的使用产生了疑问。解决方法是将连字符放在字符集的开头,并且不需要进行转义操作。例如,要匹配任何包含连字符的字母数字字符,可以使用[-a-zA-Z0-9]

在正则表达式中,方括号[]用于指定一个字符集,表示在该位置可以匹配字符集中的任何一个字符。连字符“-”在字符集中的作用是用于表示一个范围。例如,a-z表示从小写字母a到小写字母z的任何字符。然而,当连字符“-”出现在字符集的其他位置时,它可能被解释为一个普通字符,而不是范围的一部分。

为了避免连字符被错误解释,通常建议将连字符放在字符集的开头。这样,它会被正确解释为范围的一部分。例如,要匹配任何包含连字符的字母数字字符,可以使用[-a-zA-Z0-9]。这个字符集表示匹配从“-”到“a”、从“a”到“z”、从“A”到“Z”以及从“0”到“9”的任何字符。

总之,当在正则表达式中使用连字符时,将其放在字符集的开头,不需要进行转义操作。这样可以避免连字符被错误解释,确保正则表达式的准确性。

0
0 Comments

在正则表达式中,通常不需要对连字符进行转义。如果在字符类之外看到一个转义的连字符,那说明该正则表达式可能是由不太熟悉正则表达式的人编写的。

在字符类内部,我认为两种方式都可以,没有一种是常规的。根据我的经验,通常会将连字符放在字符类的开头或结尾,例如[-._:][._:-],以避免使用反斜杠进行转义。但我也经常看到连字符被转义,例如[._\-:],我不认为这种方式是不常规的。

Bash不完全处理正则表达式模式,或者以某种仍然过时的方式处理,这并不意味着某人不熟悉正则表达式。这只是Bash的方式,就是这样。

因此,对于问题“在正则表达式中,是否应该对连字符进行转义?”,答案是在字符类外部不需要转义连字符,在字符类内部使用转义连字符或不转义都是可以的。

0
0 Comments

正如所有的回答都是正确的。在字符类(也就是“方括号”)之外,连字符没有特殊的意义,在字符类内部,你可以将连字符放在范围的开头或结尾(例如[-a-z][0-9-]),或者转义它(例如[a-z\-0-9])以将“连字符”添加到你的字符类中。

在字符类内部,将连字符放在范围的开头或结尾更常见,但如果你选择转义它,也不会被一群愤怒的技术宅群众抨击。

(实际上...我的经验是,很多人在使用正则表达式时并不完全理解语法。在这些情况下,你通常会看到所有字符都被转义(例如[a-z\%\$\#\@\!\-\_]),只是因为工程师不知道什么是“特殊字符”,什么不是...所以他们“以安全为重”,用大量多余的反斜杠混淆表达式。在使用之前真正理解正则表达式语法会对你自己、你的同事和后代产生巨大的好处。)

很好的问题!

关于那些不完全理解并想要“以安全为重”而过度转义的人的观点很有用。

非常有用的答案。事实证明,在Eclipse Luna中,Java Linter会在你尝试转义连字符时发出警告。

我认为有人可能会争辩说以过度转义来混淆表达式实际上可能是颠倒的。我认为大多数使用正则表达式的人并不完全理解语法。在这种情况下,过度的反斜杠可能对大多数人来说更清晰。这并不意味着这是正确的做法,但至少可以对这个立场提出辩论。

我不确定是否同意。我理解你的观点,但是以以下表达式作为一个简单的反例:var x = 4 * 4 + 1var x = (((4) * (4)) + (1))。在这两种情况下,我都将x设置为17,但是在第二个版本中,我添加了额外的括号来使它更清晰 - 但实际上恰恰相反。

:当然,在这种情况下并不是这样。但是我假设读者缺乏某些知识,这些冗余可以解释清楚。所以以你的例子var x = (4 * 4) + 1中有多余的括号。但是如果读者不知道运算顺序,那么这些括号确实可以使它更清晰。我的观点不是任何冗余都能使事情更清晰,而是在读者不知道的情况下,冗余可以使事情更清晰。

是的,我想我明白你的观点了,但是基于我最初的主张是“在使用之前花时间真正理解正则表达式语法”,以及观察到经常有人无法做到这一点,我不得不再次不同意你的结论。

警告!在Oracle(11g)中,转义它(例如[a-z\-0-9])不起作用。它无法匹配连字符。

在Unix的grep程序中,无论连字符在模式的哪个位置,都必须转义'-'才能得到字面意义。

0