2016-12-03 6 views
4

た値の後に次のシンボルがない場合、私は、表現がしたい「(」正規表現の式と次の記号ではありません「(」

私は、次の基本正規表現があります。

(([_A-Za-z]([_\w])+)|([A-Za-z])) 

例えばテキスト:

a3+red+42+_dv+Sy(w12+44) 

は、正規表現を返す必要がありベストセラー:

a3, red, _dv, w12 

この基本正規表現は

a3, red, _dv, Sy, w12 

を返しますが、次のシンボルが "(" であるので、私は、 'Syを' を除外する必要があります。

私は次のことを試してください。

(([_A-Za-z]([_\w])+)|([A-Za-z]))(\b) 

が、それは、私は次のシンボルを持っている必要はありませ

a3+, red+, _dv+, w12) 

を返し、私は「(」次のシンボルではない場合にのみ含める必要

+2

否定先読み – m0meni

答えて

4

あなたは3つのことをする必要があります:

  • は原子団でパターンを囲む(または数量詞が含まれているあなたの交代の最初の部分少なくとも)

  • 使用aを(すぐに役に立たない位置を避けるために)ワード境​​界を使用してパターンを開始します

    \b((?>[_A-Za-z]\w+)|[A-Za-z]\b)(?!\() 
    

    PO:任意の

結果ならば、次の文字をテストするための先読みアサーションint 1は、この種の状況でバックトラックメカニズムをブロックするために重要です。Abcd(パターンがなければ、パターンは成功し、Abcを返します。アトミックグループを使用すると、パターンはAbcdと一致し、元に戻ることはできないため、次の文字で失敗します。

パターン書くためのその他の方法:あなたはどのようにこの正規表現についてのご入力で単一_を期待していない場合は

\b(?>[A-Za-z]\w*|_\w+)(?!\() 
+0

ありがとうございますが、「Sy」(Sにマッチする)から1つのシンボルを取得します。それを一切排除する方法は? –

+0

@casimir小さな文法的なグリップ:私は喜んで編集しますが、それは必要最小限の文字の下にあります。 –

+1

@DavidMetcalfe:ありがとうございます。 –

1

を:

\b[^\W\d]\w*+(?!\() 

See demo at regex101

によって+それはpossessive先読みでバックトラックを防止することができるquantifier*の後を追いました。
代わりに別の単語境界\bsee another demo at regex101)を使用できます。

+0

\ dは[0-9]を表していませんか? – ErikE

+0

@ErikE、\ dは、* digit * '[0-9]'の[short](http://www.regular-expressions.info/shorthand.html)です。ネゲートされたクラスの '[^ \ W \ d]'をネガティブな単語の文字で表すと、 '\ w'からそれを引いて' [_a-zA-Z] 'を残します。ここで(そのような構造についてもっと読む)(http://www.rexegg.com/regex-interesting-character-classes.html#obnoxious)(: –

+0

私は今それを取得しますが、私は2文字を – ErikE

関連する問題