1

正規表現を使用して単純なフィルター条件を解析しようとしています

フィルタの構文は次のとおりです。

field=value
field:value
field!=value
field<>value
etc... (you get the idea)

私は次のことを思いついた(scalaで)

val FilterEntry = """^(\w+)(!?)(=|:|<=|>=|<>|<|>)(.*)$""".r
val FilterEntry(v1, v2, v3, v4) = "field!<>value"
v1: String = field
v2: String = !
v3: String = <>
v4: String = value

いいスタートです

ここで、値が渡されないときに正規表現でキャッチ(エラーを発生)させたい

私はこれで試しました(最後のグループをオプションではありませんでした)

val FilterEntry = """^(\w+)(!?)(=|:|<=|>=|<>|<|>)(.+)$""".r
val FilterEntry(v1, v2, v3, v4) = "field!<>"
v1: String = field
v2: String = !
v3: String = <
v4: String = >

したがって、問題は、演算子を「<>」として正しく認識せず、演算子を「<」として認識し、値を「」として認識することです(firest reg expでテストすると、正しく認識されます)演算子を<>として認識し、値を "")として認識します

正規表現に演算子を貪欲に一致させるように指示する必要があると思いますが、デフォルトではそのようになっていると思いました...

- 編集

このscalaコンソールをオンラインで見つけました。正規表現をテストして くださいhttp://www.simplyscala.com/

-

4

1 に答える 1

3

貪欲です、はい、しかしそれは彼らが後戻りしないかもしれないという意味ではありません。そのためには所有格の量指定子が必要です。

これを試してください:^(\w+)(!?)(=|:|<=|>=|<>|<|>){1}+(.+)$

演算子の交代の順序が重要になり始めることに注意してください...<代替が前に表示<=された場合<>、一致エンジンは常に<最初に貪欲に一致し、次に長いオプション<=または<>オプションを一致させようとさえしません。選択肢を長さで最長から最短に並べ替えるだけであれば、この問題は発生しません。

于 2012-09-08T13:35:00.543 に答える