在正则表达式中转义正斜杠
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 中的冗余字符转义“\/””
【讨论】:
以上是关于在正则表达式中转义正斜杠的主要内容,如果未能解决你的问题,请参考以下文章