Perl 6の正規表現
5885 ワード
Perl 6の正規表現
Perl 5はテキストを処理するのが得意で、Perl 6は言語を処理するように設計されています.Perl 6は多くの処理言語に関するデータタイプを内蔵しています. Regex:正規表現を記述するために使用されます. Match:マッチングされたデータ構造を記述するために使用されます. Graammar:言語文法を記述するためのマッチング式. AST:抽象文法ツリー、テキスト言語を解析した後のデータ構造. Maro:マクロ、抽象的な文法の木に対する一連の方法集. Regex正規表現
Perl 5を習った人は幸いです.Perl 6のデフォルトのモデルはPerl 5のxmsモードです.
Perl 6は~~スマートマッチング記号を使ってマッチング演算を行います.\d and\D'ab 42'/\d/and say~$4'ab 42'/\D/and say~$a Perl 6の文字セットの略語がマッチするのはUnicodeの範囲です.\w and\W“abc 123 ABC_”~/^\w+$and say“match”match \h and\H \v and\V"U+000 A"/\v/and say"match"match「U+000 B」/\v/and say「match」;match「U+000 C」/\v/and say「match」;match「U+0085」/\v/and say「match」;match「U+2029」~/\v/and say「match」;match and\N 改行と一致し、WindowsシステムではCR LFという2文字が同時にマッチします.\t and\T マッチングtab(U+0009)\s and\S ユニックの文字セット
<:L>Letter Negation<:LC>Cased_Letter<:Lu>Uppercase_Letter<:Ll>Lowercase_Letter<:Lt>Titlecase_Letter<:Lm>Modifiter_Letter<:Lo>Other_Letter<:M>Mark<:Mn>Nonspacing_Mark<:Mc>Spacing_Mark<:Me>Eclosing_Mark<:N>Number<:Nd>Decimal_Number(alsoDigit)<:Nl>Letter_Number
各文字セットには、対応する補足の表現方法があります.L><:LC>….
文字セットの内部にはいくつかの演算子があります.を並べてセットアップ コンソール &インターレース 追加セットset difference ^異形XORは一つあればいいです.二つがあります.Letter+:Number> ユーザー定義の文字セット<...>
文字の字面量を表すには、\Q.\Eを使う必要はありません.文字列の形式を使います.
括弧処理は、グループを捕捉するために使用されるほか、グループを捕捉しない2つの書き方があります.
Perl 6の変数内挿は文字列を正規表現に変換して水泡にします.
Perl 5はテキストを処理するのが得意で、Perl 6は言語を処理するように設計されています.Perl 6は多くの処理言語に関するデータタイプを内蔵しています.
Regex Match Grammar AST Macro
Perl 5を習った人は幸いです.Perl 6のデフォルトのモデルはPerl 5のxmsモードです.
Perl 6は~~スマートマッチング記号を使ってマッチング演算を行います.
> if "string" ~~ / \w+ / { say "string match '\w+'" }
正規表現には複数の表現方法があります.> if "str" ~~ m/\w+/ { say "str match words" }
> if "str" ~~ rx/\w+/ { say "str match word" }
> if "str" ~~ m{\w+} { say "str match word" }
> if "str" ~~ m<\w+> { say "str match word" }
> if "str" ~~ m[\w+] { say "str match word" }
Perl 6の正規表現では、スペースは無視されます.\sはリターン、ポイントを表します.任意の文字を表します.> if "a
b" ~~ / ... / { say "dot could match any char" }
> if " \t
" ~~ / ^ \s+ $ / { say '\s could match \t
' }
マッチするたびに、Perl 6は、マッチング結果に関する変数を変数に保存します.if 'abcdef' ~~ / de / {
#
say ~$/; # de
say $/.prematch; # abc
say $/.postmatch; # f
say $/.from; # 3
say $/.to; # 5
};
Perl 6は依然として(.)を使用してキャプチャされているが、逆キャプチャされた変数インデックス値は0から開始される.> if "hello hello" ~~ / (\w+) <ws> $0 / { say "match two same word" }
キャプチャ値を保存する変数は、個々の変数ではなく1つの配列に入れられます.> if "hello" ~~ / (\w+) / { say "match $/[0] }
Perl 5の以下の文字セットの略語は依然として有効です."U+0035" ~~ /\d/ and say "match"; # match
"U+07C2" ~~ /\d/ and say "match"; # match
"U+0E53" ~~ /\d/ and say "match"; # match
<:L>Letter Negation<:LC>Cased_Letter<:Lu>Uppercase_Letter<:Ll>Lowercase_Letter<:Lt>Titlecase_Letter<:Lm>Modifiter_Letter<:Lo>Other_Letter<:M>Mark<:Mn>Nonspacing_Mark<:Mc>Spacing_Mark<:Me>Eclosing_Mark<:N>Number<:Nd>Decimal_Number(alsoDigit)<:Nl>Letter_Number
各文字セットには、対応する補足の表現方法があります.L><:LC>….
文字セットの内部にはいくつかの演算子があります.
+ | - & ^
<[a..c123]>
<[\d] - [13579]>
<[02468]>
数量制限子+ \w+ one or more
* \w* zero or more
? \w? zero or one match
**min..max \w**3..5
**min..* \w**4..*
正規の文字列文字の字面量を表すには、\Q.\Eを使う必要はありません.文字列の形式を使います.
'[[]]' ~~ / '[[]]' / and say "match"; # match
"{()}" ~~ / "{()}" / and say "match"; # match
グループ化括弧処理は、グループを捕捉するために使用されるほか、グループを捕捉しない2つの書き方があります.
/ f[oo]* / # will match "f", "foo", "foooo"
/ f'oo'* / # same as up
/ f"oo"* / # same as up
ブランチと結合Alternation and Conjunction/f|fo|foo/
/f||fo||foo/
/<[a..z]>+ & [...]/
/<[a..z]>+ && [...]/
零幅は断言する^
^^
$
$$
<<
>>
変数の補間Perl 6の変数内挿は文字列を正規表現に変換して水泡にします.
my $foo = "ab*c";
my @bar = <one two three>;
/$foo @bar/ exactly as: /'ab*c' [one|two|three]/
正規表現の修飾$foo ~~ m :i/ foo / # will match "foo" 'FOO'
$foo ~~ m :P5/[a-z]/ # use perl5 regex syntax
$foo ~~ m :g/ foo / # matches as many as possible
$foo ~~ m :s/ foo / # pattern whitespace is valid
$foo ~~ m :ratchet/foo|ddd/ # dont do any backtracking
m:pos($p)/ pattern / # match at position $p
他の飾りがあります.:basechar Ignore accents and other marks
:continue Continue mathing from where previous match
:byte dot mathes bytes
:codes dot matchs codepoints
:chars dot matches "characters" at current
特定の位置にマッチする修飾子があります.$_ = "foo bar baz blat";
m :3x/ a / # matches the "a" characters in each word
m :nth(3)/\w+ / # matches "baz"
修飾子は、式の内部のグループの前に置くこともできます./ a [ :i foo ] z/ # matches "afooz", "aFooz",...
修飾子:sigspaceは非常に有用で、表現のスペース表現\s+.m:sigspace/One small step/ == /\s*One\s+small\s+step\s*/
mm/One small step/ is as below
カスタム文字セットmy regex identifier { \w+ }
/ <identifier> / <==> / \w+ /
定義済みの文字セット<alpha>
<digit>
<ident>
<sp>
<ws> an arbitrary amount of whitespace
<dot> a period (same as '.')
<lt> a less-than character same as '>'
<gt> a greater-than character (same as '>')
<null> matches nothing (useful in alternations that may be empty)
前を見て後ろを見てください.<before ...> ...
<after ...> ...
/ foo <before \d+> / # ,