2

次は で何をしPerlますか?

$string =~ s#[^a-zA-Z0-9]+# #sg;  
$string =~ s#\s+# #sg;  

それ[^a-zA-Z0-9]+が文の始まりであり、少なくとも と の 1 つがa-zA-Z0-9少なくとも\s+1 つの空白であることを理解しています。
しかし、このスニペットが全体として何をするのかわかりません。

4

3 に答える 3

3

最初のパターンは、英数字以外をすべてスペースに置き換えます。

2 番目は、任意の数の空白文字 (スペース、タブ、改行) を単一のスペースに置き換えます

これら 2 つのパターンを only パターンに置き換えることができることに注意してください。

$string =~ s#[^a-zA-Z0-9]+# #sg;
于 2013-06-24T21:08:58.477 に答える
1
$string =~ s#[^a-zA-Z0-9]+# #sg;  
$string =~ s#\s+# #sg;  

より一般的に次のように書かれています

$string =~ s/[^a-zA-Z0-9]+/ /sg;  
$string =~ s/\s+/ /sg;  

区切り文字の選択は重要ではありませんが/、パターンに多数の が含まれていない限り、慣例により使用されます/

ここでは、置換演算子の 2 つのインスタンスがあります。最初の 2 つの区切り文字の間には、検索する正規表現パターンがあります。最後の 2 つの区切り文字の間には、一致するテキストを置き換える文字列があります。末尾のsgはフラグです。

sフラグは一致するものに影響します..それが使用されていないことを考えると、sフラグは役に立ちません。

このgフラグにより​​、最初の一致だけでなく、すべての一致が置き換えられます。


最初の正規表現パターン、[^a-zA-Z0-9]

[...]指定された文字の中から 1 文字に一致する文字クラスです。先頭^はクラスを否定するため[^a-zA-Z0-9]、アクセントのないラテン文字と数字以外の任意の文字に一致します。

atom+atomは1 回以上一致するため、[^a-zA-Z0-9]+一連の非英数字 (および「é」などの一部の英数字) に一致します。

したがって、s/[^a-zA-Z0-9]+/ /g英数字以外の文字 (および「é」などの一部の英数字) のすべてのシーケンスを 1 つのスペースに置き換えます。たとえば、 に"abc - déf :)"なり"abc d f "ます。


2 番目の正規表現パターン\s+

\s任意の空白文字に一致します (垂直タブと非改行スペースを除く)。

したがって、s/\s+/ /g空白のすべてのシーケンスを 1 つのスペースに置き換えます。たとえば、 に"abc\tdef ghi\n"なり"abc def ghi "ます。


全体として

一緒に使用すると、2 番目のステートメントはまったく何もしません。$string最初のステートメントの後に、2 つ以上の空白文字のシーケンスが残ることはありません。

そう

$string =~ s#[^a-zA-Z0-9]+# #sg;  
$string =~ s#\s+# #sg;

と同じです

$string =~ s/[^a-zA-Z0-9]+/ /g;  
于 2013-06-24T22:29:35.903 に答える