0

正規表現の一致を行う必要がある文字列があります (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
4

1 に答える 1

3

私見あなたは[間違った使い方をしています。A[には、一致する文字のクラスが含まれています (少なくとも 1 つの文字が一致する必要があることを意味し[ます)。パターン/文字列 (例: text5|text4) をグループ化する場合は、次を使用する必要があります(

grepl("check:[a-zA-Z0-9, ]+,(text3|text4)",checktext)
# [1] TRUE
grepl("check:[a-zA-Z0-9, ]+,(text5|text4)",checktext)
# [1] FALSE

これにより、誤検知のほとんどが削除されます。

あなたの編集に対処してください:

正規表現が間違っています ( の後の部分:)。

[a-zA-Z0-9, ]+,:?regex少なくとも[:alnum:]1 つ出現し、その後に,. これは再び一致しますSamsung

次に探す(Samsung|Nokia)が残っているものしかないGalaxy

複数の解決策があります。

"[[:alnum:], ]*(Samsung|Nokia)[[:alnum:], ]*"

"(Samsung|Nokia),[[:alnum:], ]+"

".*(Samsung|Nokia).*"

# ...

または、文字列を分割して:各部分を個別に分析することを検討する必要があります。

于 2013-07-10T07:59:03.010 に答える