在正则表达式中转义正斜杠

Posted

技术标签:

【中文标题】在正则表达式中转义正斜杠【英文标题】:Escaping a forward slash in a regular expression 【发布时间】:2011-08-29 21:26:16 【问题描述】:

我的问题很简单,它是关于正则表达式转义的。您是否必须/?你会怎么做呢?

【问题讨论】:

你使用什么语言/正则表达式实现? 有趣的是,我一直在为 javascript 寻找这个问题。但是后来我的 IDE 说我使用了不必要的转义。所以myStr.replace(/[/:.-]+/gi, '_') 出乎我的意料。我以为我需要/[\/:.-]+/gi。我无法确定这是酷还是令人困惑。 【参考方案1】:

什么上下文/语言?某些语言使用/ 作为模式分隔符,所以是的,您需要转义它,具体取决于哪种语言/上下文。您可以通过在其前面放置一个反斜杠来转义它:\/ 对于某些语言(如 php),您可以使用其他字符作为分隔符,因此您不需要转义它。但是在所有语言中,/ 唯一的特殊意义是它可能是指定的模式分隔符。

【讨论】:

【参考方案2】:

这里有几个选项:

在 Perl 中,您可以选择备用分隔符。您不仅限于m//。您可以选择另一个,例如m。那么逃跑就没有必要了。事实上,Damian Conway 在“Perl 最佳实践”中断言 m 是唯一应该使用的替代分隔符,Perl::Critic (在 CPAN 上)加强了这一点。虽然您可以使用各种替代分隔符字符,但// 似乎是以后最容易破译的。但是,如果这些选择中的任何一个导致过多的转义,请选择最适合易读性的那个。常见的例子有m(...)m[...]m!...!

如果您不能或不想使用备用分隔符,您可以使用反斜杠转义正斜杠:例如 m/\/[^/]+$/(使用可能变为 m/[^/]+$ 的备用分隔符,可能为更清楚)。用反斜杠转义斜线很常见,以至于赢得了一个名字和一个***页面:Leaning Toothpick Syndrome。在只有一个实例的正则表达式中,转义斜线可能不会上升到被认为是可读性障碍的程度,但是如果它开始失控,并且如果您的语言像 Perl 那样允许使用备用分隔符,那将是首选的解决方案。

【讨论】:

你能举个例子吗?我有这个:perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf 我与正斜杠发生冲突。 请注意,在使用正则表达式进行替换(也称为替代)时,您使用的是s,而不是m。 perlfect.com/articles/regex.shtml @CMCDragonkai perl -pi -e "schdir .*chdir $ROBOT_PATHg" startup_scripts/supervisord.conf ... 但这可能更好:perl -pi -e 's/chdir .*/chdir $ENVROBOT_PATH/g' startup_scripts/supervisord.conf 因为它避免了外壳插值。 转义文字 / 字符的替代方法是使用正则表达式功能,通过其 ASCII 编码(十六进制或八进制)指定字符。 Perl 接受八进制形式\57(来源regular-expressions.info/refcharacters.html) 在 lukeuser 链接的页面中(谢谢)还有转义序列 \Q...\E 。这对我有用。【参考方案3】:

使用反斜杠\ 或选择不同的分隔符,即m#.\d# 而不是/.\d/ "在 Perl 中,您可以将 / 正则表达式分隔符更改为几乎任何其他特殊字符,如果您在它前面加上字母 m(用于匹配);"

【讨论】:

【参考方案4】:

如果分隔符是/,则需要转义。

【讨论】:

【参考方案5】:

如果您使用的是 C#,则不需要转义它。

【讨论】:

可能是,但这里他们使用的是 perl。【参考方案6】:

对于java,你不需要。

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

如果你把\放在/前面。 IDE 会告诉你“ReGex 中的冗余字符转义“\/””

【讨论】:

以上是关于在正则表达式中转义正斜杠的主要内容,如果未能解决你的问题,请参考以下文章

在正则表达式中转义特殊字符

python 正则表达式中反斜杠()的麻烦和陷阱

如何在 oracle 中转义特殊的正则表达式字符?

python 正则表达式中反斜杠()的麻烦和陷阱 (转)

需要在正则表达式中转义的所有特殊字符的列表

应该在正则表达式中转义哪些文字字符?