2017-02-28 20 views
2

文字列の異なる種類の文字列+数字+記号の組み合わせを抽出できる正規表現を作成しようとしています。私は抽出しようとしている文字列の種類は次のとおりです。thisに基づいて文字列から英数字+記号の組み合わせを抽出するRegEx

avs-tldr-02 this is a test 
cc+asede this is a test 
x86_64 this is a test 

this is a test avs-tldr-02 this is a test 
this is a test cc+asede this is a test 
this is a test x86_64 this is a test 

this is a test avs-tldr-02 
this is a test cc+asede 
this is a test x86_64 

:私はテストしていたエッジの例

avs-tldr-02 
cc+asede 
x86_64 

タイプは初めに、ミドルと文章の最後に現れるこれらの文字列です優秀な答えは、私は正規表現で「前後参照」アサーションと周りに手を出してきて、次が出ている:

(?=.*[:alnum:])(?=.*[:punct:])([a-zA-Z0-9_-]+) 

はしかし、これは、sの最初の単語にマッチし続けますtring - 私はこれがなぜ起こっているのか理解していますが、私のユースケースのためにこれを調整する方法を失っています。

私が探しているものを得るためにこれを変更するにはどうすればよいですか/この問題に取り組む他の方法はありますか?

+0

あなただけ 'strsplit'と' grep'使用することができます:))便利: 'sapply(strsplit(S、 '\\ S +')、grepを、パターンを= '[[:PUNCT:]]' 、value = TRUE) ' – alistaire

答えて

3

私は

/([^\s]+?[-_+][^\s]+)/g 

この正規表現を使用し、私はRに慣れていないんだが、テストの正規表現は格好良いです!https://regex101.com/r/Sxully/1

注:「または」「で与えられた正規表現を実装するには、この正規表現を使用_word_starting_by_underline」「を、あなたが受け入れるかどう言語と使用

に依存してバックスラッシュと\\にご注意」:(それは文句を言いません

/([^\s]*?[-_+][^\s]+)/g 
// ^^^^ + changed to * to support nothing before [-_+] 
+1

それは動作し、理解しやすくなります。 –

+0

論理はシンプルで、 '\ s'でなく、少なくとも[ - _ +]一度だけ存在します! – MohaMad

2

パターンにはいくつかの問題があります。 [:alnum:]または[:punct:]のようなPOSIX文字クラスは、そのように解析されるブラケット式の中に置く必要があります。もう1つのことは、.*が任意のchar(PCRE正規表現の改行文字以外)に一致するため、がovermatchされてになるため、lookaheadパターンが予想よりもはるかに遠い場合にtrueを返します。

私はregex demo

詳細を参照してください

(?=[[:punct:]]*[[:alnum:]])(?=[[:alnum:]]*[[:punct:]])[[:alnum:][:punct:]]+ 

使用することをお勧め:

  • (?=[[:punct:]]*[[:alnum:]])を - 、現在の位置に句読点記号は、英数字の文字に続い0+がなければなりません
  • (?=[[:alnum:]]*[[:punct:]]) - 現在の位置(先読みと同じ、テキストを消費しないゼロ幅のアサーション)で、0以上の英数字の文字の後に句読記号が続く必要があります。
  • [[:alnum:][:punct:]]+ - 1つ以上の英数字または句読記号。

マッチの開始/終了時に英数字を必要とする場合は、両端に単語境界(\b)を追加することができます。

関連する問題