Perl regexp tr //“我不明白为什么会这样做?”

时间:2013-09-11 21:48:53

标签: regex perl

我对字符串$ text

执行了以下操作
$text =~ tr/a-zåàâäæçéèêëîïôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'()\-,.?!:;/\n/cs;

这样做是为了在换行符中拆分字符串。这就是我想要做的事情

  

但我不明白为什么会这样做?

我认为这条线路会占用所有字符a-zåàâäæçéèêëîïôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'() - ,。?!:;并用\ n

替换每一个

我不知道cs到底是做什么的。 Here你可以得到cs的解释,但我不明白这意味着什么:

  

“c - 用于指定SEARCHLIST字符集   可补“

     

“s - 用于指定字符序列   音译到同一个角色被压缩成一个单一的   字符“

的实例

示例:

$text= "a ar? å ..";

给出

a AR?
å
..

3 个答案:

答案 0 :(得分:5)

  

c - 用于指定SEARCHLIST字符集是否已补充

在这种用法中,"complemented"类似于“否定”或“反转”,因此不会替换表达式中列出的字符,而是替换表达式中找到的每个字符。在您的示例字符串中,这意味着所有空格都替换为换行符,因为每个其他字符都包含在集合中。

答案 1 :(得分:4)

如果您想将所有空格转换为换行符,列出所有 not 空格的内容很麻烦,您可能会忘记一些空格。您可以使用正则表达式直接在空格上工作。

s{\s+}{\n}g;

s{...}{...}是使用正则表达式而不仅仅是字符的“搜索和替换”。 \s是正则表达式代表“空白”,包括空格,制表符和换行符。 +表示匹配其中的一个或多个,因此一行中的多个空格将变为一个换行符。 g修饰符表示“全局”或跨越字符串中的每个字符,否则它将在第一个匹配时停止。

foo bar     baz

变为

foo
bar
baz

答案 2 :(得分:3)

  

“c - 用于指定SEARCHLIST字符集被补充”

这意味着它会使用\n替换搜索列表中的任何。在您的示例中,不在搜索列表中的唯一字符是空格。因此,每个空格都会被换行替换。作为Schwern pointed out,这不是一个很好的方法。

  

“s - 用于指定音译到同一个字符的字符序列被压缩为单个字符实例”

这意味着如果一行中有三个字符被翻译(导致一行中有三个\n),则三个\n将被“压缩”为一个\n。如果您在示例输入中添加了一些空格,则可以看到此操作:

# Multiple spaces separating words
my $str = "a   ar?  å";

不挤压:

$str =~ tr/a-zåàâäæçéèêëîïôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'()\-,.?!:;/\n/c;

输出:

a



ar?


å

挤压:

$str =~ tr/a-zåàâäæçéèêëîïôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'()\-,.?!:;/\n/cs;

输出:

a
ar?
å