質問

私はバイト櫛のラッパーを使用しています(http://bytecomb.com/Regual-Expressions-in-vba/)。彼らは非常にうまく機能しているようです。堅牢なパターンの策定に役立つ必要があります。

lookahead "(?=)"と "|"を組み合わせると、予期しない結果が発生します。

Input Text String           Pattern                 RxMatch
-----------------           -------                 -------
iraq                q(?!u)                  q
quit                q(?!u)                  0
iraq                q(?=u)                  0
quit                q(?=u)                  q
sta.23.5  .1 words 67.89  ch    \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words 67.89  ch    (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)              67.89
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       67.89
sta.23.5  .1 words .89  ch      \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words .89  ch      (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)              89
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       .89

「イラク」と「終了」は、予想どおりに機能します。次の入力テキスト文字列のセットについては、「67.89」を抽出し、3番目の「.89」を抽出したいと考えています。最初に、両方の状況をカバーするために浮遊小数数を浮かべるために、 d+。? d*|。 d+を策定しました。括弧を追加することは役に立ちませんでした。 67.89の削除または支援。最後に、実用的なソリューションを見つけました。しかし、もっと良いものはありますか?優先順位を理解するのを手伝ってくれますか?可能であれば、ORの2つの部分を一緒に保ちたいと思います。

ありがとう、非プログラマー!

役に立ちましたか?

解決

\d+\.?\d*|\.\d+(?=\s*ch) 「sta.23.5 .1ワード67.89 ch」に適用 \d+\.?\d*

または「|」そのように考えたい場合は、パターンを2つの可能な一致に分割します。 \d+\.?\d*\.\d+(?=\s*ch)

防止したい場合 \d+\.?d* 23.5を一致させることから、スペース文字の前にスペース文字を要求するなど、追加の基準を追加し、括弧をキャプチャしてサブマッチとして数字を取得するなど、追加の基準を追加する必要があります。 \s(\d+\.?\d*)

あなたはこのパターンと両方を一致させることができます、 \s(\d+\.?\d*)|\.\d+(?=\s*ch), 、しかし、前半が一致する場合、実際の値のサブマッチを見ていることに注意してください。

ここでの本当の問題は、VBScriptのregexpクラスがLookbehindをサポートしていないことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top