正規表現の一致を行う必要がある文字列があります (R で作業しています)。次のようになります。
"354542676655341568:1373344735:270969722:text1,text2,text4,text8"
この文字列は、コロン ( ) で区切られた 4 つの部分で構成されてい:
ます。値が異なる複数の文字列がありますが、同じ 4 つの部分で構成されています。2"[0-9]{18}"
番目の部分 (タイムスタンプ) については、追加する範囲の正規表現を生成するコードがあります。サンプルは次のようになります。
":0*13733([0-3][0-9]{4}|4([0-3][0-9]{3}|4([0-7][0-9]{2}|800))):"
上記のパターンは、1373300000 と 1373344800 の間のすべての数値に一致します。3 番目の部分もプレーンです。[0-9]{9}
問題は 4 番目の部分で、テキスト部分を一致させる必要があります。text1
、、、text3
のようなテキスト コンテンツのリストがありますtext5
。リストのテキストが少なくとも 1 つある場合は、文字列を受け入れる必要があります。これは、4 番目の部分の部分文字列の一致に似ています。
テキストを分割することも考えましたが、私のアプリケーションでは、リソース コストが高く、貧弱なデザインになってしまいます。したがって、一致全体を一緒に実行する 1 つの正規表現を生成したいと思います。
これをテストするためにいくつかのことを試しましたが、誤検知が発生しています。利用可能なヘルプはありますか?
checktext = "check:text1,text2,text3"
> grepl("check:[a-zA-Z0-9 ]+,text2",checktext)
[1] TRUE
> grepl("check:[a-zA-Z0-9, ]+,text2",checktext)
[1] TRUE
> grepl("check:[a-zA-Z0-9, ]+,[text3|text2]",checktext)
[1] TRUE
> grepl("check:[a-zA-Z0-9, ]+,[text3|text4]",checktext)
[1] TRUE
> grepl("check:[a-zA-Z0-9, ]+,[text5|text4]",checktext)
[1] TRUE
> grepl("check:[a-zA-Z0-9, ]+,[text5|text4][a-zA-Z0-9, ]$",checktext)
[1] FALSE
> grepl("check:[a-zA-Z0-9, ]+,[text5|text3][a-zA-Z0-9, ]$",checktext)
[1] FALSE
> grepl("check:[a-zA-Z0-9, ]+,[text5|text3][a-zA-Z0-9, ]+?$",checktext)
[1] TRUE
> grepl("check:[a-zA-Z0-9, ]+,[text5|text4][a-zA-Z0-9, ]+?$",checktext)
[1] TRUE
> grepl("check:.*[text1].*",checktext)
[1] TRUE
> grepl("check:.*[text2].*",checktext)
[1] TRUE
> grepl("check:.*[text3].*",checktext)
[1] TRUE
> grepl("check:.*[text2|text4].*",checktext)
[1] TRUE
> grepl("check:.*[text5|text4].*",checktext)
@sgibb の返信の後、すべてのパーツをまとめて最終的なパターンを次のように作成しました。
"[0-9]{18}:0*13733([0-3][0-9]{4}|4([0-3][0-9]{3}|4([0-7][0-9]{2}|800))):[0-9]{9}:[a-zA-Z0-9, ]+,(Samsung|Nokia)"
私のテキスト文字列は次のとおりです。
"354542676655341568:1373344735:270969722:Samsung,Galaxy"
一致しませんでした。全部まとめたせいでしょうか?正規表現から最後の (テキスト) 部分を削除すると、一致しました。
> finalpattern
[1] "[0-9]{18}:0*13733([0-3][0-9]{4}|4([0-3][0-9]{3}|4([0-7][0-9]{2}|800))):[0-9]{9}:"
> keysample
[1] "354542676655341568:1373344735:270969722:Samsung,Galaxy"
> grepl(finalpattern,keysample)
[1] TRUE