Perl在藏文中的正则表达

时间:2009-10-09 04:54:20

标签: regex perl

我正在尝试删除/删除藏文脚本的倒数第二个字符,如下所示(以下示例中的字符为英文):

$char = "ti.be.tan.|";           

所以我想删除“倒数第二个”字符“。”我用以下关于RE的知识尝试了以下方式:

$char =~ s/.|$/|/g;
$char =~ s/[.|]$/|/g;
$char = tr/.|//d;       # and later add |.

我做错了什么?

4 个答案:

答案 0 :(得分:8)

在我告诉你你需要做什么之前,让我们来看看你做错了什么:

$char =~ s/.|$/|/g;

这里的问题是正则表达式中.|都是元字符|表示“或”,因此您说的是“匹配.$”。您正确地知道$表示字符串的结尾,但.表示“任何一个字符”。所以它立即匹配一个字符,并继续立即匹配一个字符,每次将该字符更改为|(元字符不适用于s///表达式的后半部分),然后匹配字符串的结尾并在其中添加|。或类似的东西。基本上,不是你想要发生的事情。

$char =~ s/[.|]$/|/g;

好吧,在[]内,.|不再是元字符,但[]表示“其中一个”,所以这个正则表达式会查找之前的字符字符串的结尾,如果它是|.,则会将其更改为|。再一次,不是你想要发生的事情。

$char = tr/.|//d;       # and later add |.

tr是这项工作的错误工具。这会删除字符串中的所有.|字符,期望您没有使用=~正则表达式匹配运算符,而是使用=赋值运算符。绝对不是你想要发生的事情。

你想要的是这个:

$char =~ s/\.\|$/|/;

我们已使用.转义了|\,因此Perl知道“\之后的字符是一个没有特殊含义的文字字符* “并匹配字符串末尾的文字.|,并将其替换为|

那就是说,听起来你对正则表达式有点新意。我是perldoc perlretut的忠实粉丝,我认为这是Perl中正则表达式最好的(如果不是 最佳)介绍之一。你应该真正阅读它 - 正则表达式是一个强大的工具掌握在那些了解它们的人手中,对于那些不熟悉它们的人来说是一个强大的头痛。

答案 1 :(得分:3)

Chris Lutz已经提供了一个很好的答案,所以我只想提供额外的答案,以防你想删除其他类型字符串的第二个字符。

这是:

$char =~ s/(.)(.)$/\2/g;

Basicaly,Perl(实际上是RegEx)会将'('和')'之间的所有内容映射到组。您可以在以后操作该组。从这段代码开始,gourps就是。

$char =~ s/(.)(.)$/\2/g;
#          ^-^^-^  ^^
#  Capture G1 G2   ++-- Then replace it with only group 2

所以在这种情况下,Perl从第一个字符开始,因为它不匹配任何一个,它放开(不替换),当它找到一个匹配时它用你指定的匹配替换匹配(在这种情况下是组# 2)。

希望这有帮助。

答案 2 :(得分:1)

在这种情况下,你也可以使用substr作为左值:

$char = "ti.be.tan.|";
substr($char,-2,1) = "";
print $char;               # ===>  ti.be.tan|

答案 3 :(得分:0)

还有使用正向前瞻断言去除第二个最后一个字符的方法。

$char ~= s/.(?:.$)//;

对于任何紧跟单个字符和字符串结尾的字符,基本上都会替换为“”。

如果第二个最后一个字符始终是特定字符,则可以替换第一个字符。记得要逃避RE元字符()[] /.*?