6

値 (例: 12345)、関係記号 (<、>、<=、>=)、ジャンクター (&、!) で構成される正規表現を単純化する方法を探しています。例:

>= 12345 & <=99999 & !55555 

一致する必要があります。私はこの正規表現を持っています:

(^<=|^<= | ^>= | ^>= |^<|^>|^< |^> |^)((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*

式の最初と最後に <=, >=, <, > が繰り返されるのが特に不満です。先を見る、振り返るなど、より簡単にする方法のヒントをいただければ幸いです。

4

6 に答える 6

1

正規表現から始めて、次の単純化手順を実行できます。

 (^<=|^<= | ^>= | ^>= |^<|^>|^< |^> |^)((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
  1. アンカーを交互の外に移動します

    ^(<=|<= |>= |>= |<|>|< |> |)((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
    

    アンカーの前に空白があるのはなぜですか? (それを削除しました)

  2. 次の空白を外側に移動し、オプションにします

    ^(<=|<=|>=|>=|<|>|<|>|) ?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
    
  3. 代替の重複を削除します

    ^(<=|>=|<|>|) ?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
    
  4. 最後の空の代替は、空の文字列に一致します ==> この代替はオプションです

    ^((<=|>=|<|>)? ?)?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
    
  5. 等号をオプションにし、重複を削除します

    ^((<|>)=? ?)?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
    
  6. 単一文字による代替は、文字クラスに置き換えることができます

    ^([<>]=? ?)?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
    
  7. 最後に交互に同様のことを行うと、次のようになります。

    ^([<>]=? ?)?((!|)([0-9]{1,5}))( ?(& ?([<>]=?)?)?|$)
    

これはテストされていません。セマンティックは変更しませんでしたが (そう思う)、エディターで変更しました。

于 2012-05-23T21:25:03.823 に答える
0

すべてのスペースを (疑問符で) オプションにすることができるので、すべての可能性を明示的にリストする必要はありません。また、文字セット ([ ]) で等号/不等号をグループ化することもできます。

このように、私は思う

(^[<>]=?\s?)((!|)([0-9]{1,5}))(\s?&\s?[<>]=?\s|$)*
于 2012-05-23T20:33:32.547 に答える
0

どうですか

[<>]=?|\d{1,5}|[&!\|]

> / >= / </ <= の繰り返しを処理します。私にはうまくいくようです。

これがあなたの質問に答えるか、または作業が必要かどうかお知らせください。

于 2012-05-23T20:33:46.710 に答える
0

オプションのスペースを一致させるために多くの労力を費やしているようです。\s?(0 - 1) または(0 - 多く) のようなもの\s*が良いでしょう。

また、何かで区切られた反復項目は常に困難です。繰り返しを単純化するために、「もの」の正規表現を作成するのが最善です。

limit = '\s*([<>]=?|!)\s*\d{1,5}\s*'
one_or_more = '^' + limit + '(&' + limit + ')*$'

または、次のように展開します。

^\s*([<>]=?|!)\s*\d{1,5}\s*(&\s*([<>]=?|!)\s*\d{1,5}\s*)*$

また、!私が正しく理解していれば、「関係の兆候」であり、「ジャンクター」ではありません。

(「本物の」パーサーの使用を提唱する人々にとって、上記の構造one_or_more- はおそらく & 区切りリストを実装する方法です。言語で文字列連結を使用するだけであれば、パーサーは必要ありません) .

于 2012-05-23T20:50:18.413 に答える
0

私は2段階の手順を念頭に置いています。最初にジャンクターでブレークし、次に個々のパーツをチェックします。

final String expr = ">= 12345 & <=99999 & !55555".replaceAll("\\s+", "");
for (String s : expr.split("[|&]"))
  if (!s.matches("([<>]=?|=|!)?\\d+")) { System.out.println("Invalid"); return; }
System.out.println("Valid");

しかし、あなたがバリデーションについて話しているのか、それとも何か他のことについて話しているのか、まだ推測が残っています.

于 2012-05-23T20:39:14.767 に答える
0

これはあなたが望むものです:

^(\s*([<>]=?)?\s*!?\d{1,5}\s*(&|$))*

sum sub 式のこれらの説明は、全体を理解するのに役立ちます。

\s*: 0 個以上のスペース
([<>]=?)?:オプションで が続く<または記号、すべてオプション: およびオプション: 1 ~ 5 桁:または文字列の末尾>=
!?!
\d{1,5}
(&|$)&

于 2012-05-23T20:56:45.460 に答える