Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 不带分隔符的异常替换_Regex_Perl - Fatal编程技术网

Regex 不带分隔符的异常替换

Regex 不带分隔符的异常替换,regex,perl,Regex,Perl,我无法解读这个正则表达式的含义: $c =~ s^.*/^^g; 我没有访问输入或输出的权限 有人知道它的作用吗 此处^用作分隔符 s^.*/^^g; s/.*\///g; 我们可以使用任何可打印字符作为正则表达式分隔符 s^.*/^^g; s/.*\///g; 两个正则表达式都是相同的 非标准分隔符主要用于避免在正则表达式模式中转义分隔符字符。为了 $c = "this is a string with / slash"; 现在你的正则表达式应该是 $c =~ s/.*\///

我无法解读这个正则表达式的含义:

$c =~ s^.*/^^g;
我没有访问输入或输出的权限


有人知道它的作用吗

此处
^
用作分隔符

s^.*/^^g;

s/.*\///g;
我们可以使用任何可打印字符作为正则表达式分隔符

s^.*/^^g;

s/.*\///g;
两个正则表达式都是相同的

非标准分隔符主要用于避免在正则表达式模式中转义分隔符字符。为了

$c = "this is a string with / slash";
现在你的正则表达式应该是

$c =~ s/.*\///
          ^^
在这里,你正在逃离刀口

两个正则表达式都是相同的。 我们将使用任何我们想要的正则表达式@simbabque在评论中提到

 s{foo}{bar}gs # here curly braces are delimiter
 s[some][same] # here square bracket are delimeter.
为了方便起见,我们还将使用字符作为正则表达式分隔符


为了避免转义,我们可以使用其他分隔符。

s//的默认分隔符是斜杠,但您可以使用任何可打印字符作为替代

所以

相当于

$c =~ s/.*\///g
请注意,使用常规分隔符需要转义模式本身中的斜杠

有些选项比其他选项更好,如果您只是试图避免在模式中转义斜杠,我认为管道字符
|
更好

我不希望从这个程序员那里学到太多东西。正如您所经历的,
^
是一个糟糕且令人困惑的选择。另外,
/g
修饰符是多余的,
$c
对于标识符来说是一个糟糕的选择

我会写

$c =~ s|.*/||

非常感谢。你知道这是在哪里记录的吗?@JohnDoe也在和之前的分章中。可以使用任意单个字符作为类似引号的运算符的分隔符。如果它是一种成对的支架,那么它们就起作用了
s{foo}{bar}
s
等等。但是
s~foo~bar~
s]foo]bar]
也起作用。你甚至可以使用字母<代码>$foo=~s sfoosbars,但是在
s
之后需要一个空格。每天,我都会有另一个Perl惊喜!谢谢!:)@mkHun:我认为你可以给出一个比你链接到的答案更好的例子。冒号
与扬抑符
^
一样糟糕,看起来像线噪波,如果您尝试在解决方案中打高尔夫球并且在
后面不加空格,情况会变得更糟
和周围的
=~
。这可能是我个人的喜好,但我觉得这根管子不太合适。它看起来太像一个or操作符了。如果对这些类似引号的运算符有疑问,我总是使用一对括号作为分隔符。通常是卷曲的。毕竟他们把两块东西围起来了。当然这是个人喜好,但你应该为其他读者写作
s |.*/|
明显比
s{.*/}{}
干净得多,而且它的优点是
/
都是简单的行。是的,`s\./\\`也可以,但那是另一个问题!