No.3ベストアンサー
- 回答日時:
GNU Awk v3.1.8 (DFA 型)
awk 'BEGIN { str = "abcdefg"; sub(/a(bc|bcd)/, "xxx", str); print str; }
xxxefg
Perl v5.12.3 (NFA 型)
perl -e '$str = "abcdefg"; $str =~ s/a(bc|bcd)/xxx/; print "$str\n";'
xxxdefg
私もあまり詳しくはありませんが、DFA 型では選択を同時並行的に進めて、最長のものがマッチするようです。AWK は DFA 型を採用している少ない例で、Perl, Python, Ruby 等は NFA 型になっています。
ご回答ありがとうございました。
ご回答を拝見しまして、以前勉強の為にDFA型の正規表現エンジンを作成したこと思い出し試してみましたところ、確かにAWKと同じ結果になりました。
---
regexp : a(bc|bcd)
string : abcdefg
match : ^ ^ # aとdを指しています。
---NFA状態遷移表
no.: chr goto
0 : "a" [1]
1 : "b" [2, 4]
2 : "c" [3]
3A :
4 : "c" [5]
5 : "d" [6]
6A :
---DFA
NFAをDFAに変換
no.: NFA状態no.
0 : [0]
1 : [1]
2 : [2, 4]
3A : [3, 5]
4A : [6]
---DFA状態遷移表
no.: chr goto
0 : "a" 1
1 : "b" 2
2 : "c" 3
3A : "d" 4
4A :
---
仰るとおり、同時並行的に進めて最長のものがマッチするDFA状態遷移表が作成されました。
なるほど、DFA型とNFA型で動作が異なるのですね、参考になる情報ありがとうございました。
ただ秀丸エディタの正規表現ライブラリがDFA型かというとそうでは無いように思えますが、NFA型でも作り方によって動作というか結果が異なるのでしょうか。
No.6
- 回答日時:
GNU sed v4.2.1 (or v1.18)
echo 'abcdefg' | sed 's/a\(bc\|bcd\)/xxx/'
xxxefg
sed は NFA 型に分類されていると思いますが、私の手元にある2つのバージョンの実行結果は DFN 型と同じになります。GNU 版は DFA 型を採用しているのか、あるいは NFA 型だが細かいところの違いがあるのか、どちらなんでしょうか。後者だとすれば秀丸と同じ状況?
再びのご回答ありがとうございました。
正規表現エンジン種類について検索しましたところ「詳細正規表現」という書籍のサンプルページを見つけました。
http://books.google.co.jp/books?id=RJFJ2I-thlsC& …
そこには正規表現エンジンの種類として、DFA型、従来型NFA、POSIX NFA等があり、従来型NFAか否かを見分ける方法として正にこの質問で書いた正規表現の例が書かれておりました。
'abcd'がマッチするものはDFA型か、POSIX NFAというタイプであるとのことです。
正規表現エンジンの型というヒントをいただいたおかげで回答にたどり着くことができました、本当にありがとうございました。
No.5
- 回答日時:
>私は演算子'|'の動作としては、rubyやpythonの動作が普通で秀丸エディタの動作が特異だと考えたのですが、その理解で良いのでしょうか?
「普通」「特異」とはなんぞやと言うことで変わってきます。
そもそも、正規表現は、ed エディタや grep コマンドなどが発祥なので、そういう観点からするとabcdにマッチするのが「普通」です(edやgrepだと /a\(bc\|bcd\)/ ですが)。
現在では正規表現が使われるのはプログラム中のことが多いと思う(個人的な推測)ので、そういう観点からするとabcにマッチするのが「普通」じゃないかなと思います。
ご回答ありがとうございました。
私の当該文章の中で書いた「普通」「特異」という表現は適切ではありませんでした、あの文章は個人的な感覚として書いてしまいました。
何らかの統一された仕様があり、それに則っているか、否かと書いた方が適切だったと思います。
あと、申し訳ありません、頂いたご回答の中で判らない部分があります。
> 正規表現は、ed エディタや grep コマンドなどが発祥なので、そういう観点からするとabcdにマッチするのが「普通」
これはDFA型のエンジンを搭載しているものは、abcdにマッチするのが普通という意味と理解しました。
> 正規表現が使われるのはプログラム中のことが多いと思う(個人的な推測)ので、そういう観点からするとabcにマッチするのが「普通」
この意味合いがよくわかりません?(一応、私の個人的な感覚とも一致はしているのですが……)
プログラムの式で使用される四則演算子の様に左結合していく(左の要素から評価する)のが普通と考えられるという理解で良いでしょうか?
No.2
- 回答日時:
どうなっているかが重要なのではなくどうしたいかです
条件が競合しているのであれば「どちらかがヒットする」で
どちらがヒットしても文句はいえないでしょう。
たとえばabcdを優先して、dがなくてもヒットするなら
/abcd*/
で十分ですね。(abcの後ろに0個以上のdがある)
今回の命題だと逆の条件はつけられないです
abcから始まってabcがヒットしたらそれでおしまいなら
abcdにはどうやってもヒットしません。
考えて書けばさほど問題になるケースではありません
ご回答ありがとうございました
> どうなっているかが重要なのではなくどうしたいかです
発端は望んだ検索ができなかったことによるのですが、この質問をさせていただいたのはあくまで興味というか素朴な疑問によるものです。
従いまして、この質問においては「どうなっているか」に重点がありますことお汲み取りいただけますと幸いです。
No.1
- 回答日時:
まったく統一されていません。
この回答への補足
申し訳ありません、質問の仕方が悪かった様ですので補足させていただきます。
ツールにより使用できる演算子が違うというのは存じ上げております。
質問の意図は同じ演算子でも動作が異なることがあるのは普通のことなのかということになります。
ご紹介いただいたリンク先を拝見しますと、演算子'|'は左右のどちらかにマッチしますと書かれております。
http://www.kt.rim.or.jp/~kbk/regex/regex.html#VBAR
質問に書いた正規表現で'|'の左右の文字を逆にすると、秀丸エディタでは結果が変わらず、rubyでは結果が変わります。
これは秀丸エディタの正規表現ライブラリでは、'|'の両側を評価してマッチする文字列の長い方を返す仕様だと理解しました。
一方rubyは'|'の左側を評価してマッチすれば右側は評価しないような仕様に見えます。
試しにpythonでも試しましたがrubyと同じ結果になりました。
私は演算子'|'の動作としては、rubyやpythonの動作が普通で秀丸エディタの動作が特異だと考えたのですが、その理解で良いのでしょうか?
それともこのような細かい動作の違いまで各ツール毎に異なっているのでしょか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい 3 2022/09/02 15:17
- その他(コンピューター・テクノロジー) 正規表現の置換で数値を合計したいです。 2 2022/10/17 11:01
- YouTube 日本語文向けの正規表現が学べるサイトやYouTubeチャンネルがあったら教えてほしいです。 「正規表 6 2022/04/26 07:02
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- Access(アクセス) AccessVBAで任意の複数リンクテーブルをAccessVBAを動かす際に削除したいと考えておりま 1 2022/11/17 15:45
- Java JAVAの1つの正規表現で上記Textすべてと合致する正規表現を教えてください。 4 2022/11/06 08:46
- Java 正規表現について質問です。 カンマありの整数と、カンマなしの整数をよしとする正規表現が知りたいです。 4 2022/05/20 07:59
- 数学 正規数の定義で分からないことがあります。 正規数の定義について専門書において 「xがr進正規であると 1 2023/07/17 20:50
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
grepの正規表現での最短マッチ...
-
正規表現の仕様について
-
vbaの正規表現で、マッチした一...
-
[VBS] テキストファイルから任...
-
正規表現です。括弧内にある複...
-
正規表現で( , -, ] を表すと。
-
Mで始まりuで終わる文字列
-
正規表現 秀丸エディタ 行頭か...
-
wordの何も書かれていない2ペー...
-
PS4コントローラーをPCでゲーム...
-
EXCELで=より左の文字を一括で...
-
エクセルでアルファベットか数...
-
Chr(13)とChr(10)の違いは?
-
EBCDIC⇒SJIS変換の方法
-
文字列からタブコードを取り除...
-
PDFの改行URLを有効にす...
-
セル内の文字列が日本語か英語...
-
Excelで3E8を3.00E+8にしない方...
-
Accessにインポートしようとす...
-
Excelで指数表現しないようにす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
vbaの正規表現で、マッチした一...
-
メールアドレスの正規表現について
-
[VBS] テキストファイルから任...
-
正規表現でシングルクォーテー...
-
文章中全ての半角カッコ ( の...
-
MFCで正規表現
-
[正規表現] 数字範囲をヒット...
-
Mで始まりuで終わる文字列
-
正規表現でAND検索はできる...
-
C言語にパターンマッチってない...
-
正規表現で囲まれた部分の文字列
-
正規表現です。括弧内にある複...
-
さくらエディタでGrep検索する...
-
文字列検索(grepのようなもの)...
-
正規表現で、青空文庫形式の入...
-
正規表現で一致しない(否定)場...
-
C言語のコメントを「正規表現」...
-
正規表現でカウントアップ(?)す...
-
正規表現で特定文字列の全角カ...
おすすめ情報