0

こんにちは、文字列をパターンと照合しようとしています

これは可能な文字列です

signal CS, NS, dl: stateType := writeOrRead0; 
signal CS, pS : stateType := writeOrRead0; 
signal dS : stateType := writeOrRead0; 

私は最初のコロンまでのパターンにのみ関心があります。

しかし、定義するシグナルの数は1つ以上にすることができ、3つまたは4つにすることもできますが、これは私が持っている正規表現です

^signal\\s*(\\w+),*\\s*(\\w+)\\s*:

それは2番目の2つの信号をピックアップしますが、2番目の信号ではCSとpSをピックアップしますが、次の信号のdとSを使用すると

matcher.group()

別々に来る

信号名が 1 つ 2 つ 3 つ以上あるかどうかに関係なく、すべての信号名を取得する式を誰か教えてもらえますか?

4

3 に答える 3

5

シグナル名ごとにグループを持ちたい場合、それは不可能です (シグナル数の上限がない限り、すべてを書き出すことはできますが、非常に見苦しくなります)。

そのため、カンマで区切られた名前を含む 1 つのグループと一緒に暮らす必要があります。次に、それを後処理して、実際の信号名を取得できます。

それは次のようなものを与えるでしょう

^signal\s+((?:\w+(?:,\s*)?)*)\s*:

(Java String としてエスケープしなかったことに注意してください。)

グループ 1 はあなたの名前です。

于 2012-10-25T11:00:52.240 に答える
4

私は次のことをします:

1- 信号の完全なグループを取得します: CS、NS、dl (例)

2-それらを解析する

あなたの例:

1-^signal\\s((\\w*)(?:,\\s)?)+

2-「CS、NS、dl」のようなグループに文字列があり、「、」の単純な分割で、それらを配列に含めることができます。

于 2012-10-25T11:00:43.327 に答える
0

この正規表現を使用できます:

^シグナル\s([\w,\s]*(?=:))

信号とそれに続くスペースで始まり、コンマとスペースが続く単語のゼロ回以上の出現をキャプチャします。「:」でキャプチャを終了しますが、一致には含めません。

マッチにシグナル自体を含めないようにするには、次のように後読みを使用できます。

^(?<=信号)\s([\w,\s]*(?=:))

于 2012-10-25T11:00:59.550 に答える