2

簡単な質問 -

たとえば {x,y} から文字列の言語を作成するにはどうすればよいでしょうか。ただし、すべての文字列を (xy) で否定します。

私の試みはこれまでのところ:

\bx*[^(xy)]*y\b または \by*[^(xy)]*x\b または\b[^(xy)][xy]*[^(xy)]*\b

最後のものは最も制限が少ないですが、[^(xy)] を複数回使用するのは扱いにくいようです。

(xy) を含むが、他のすべての組み合わせを許可する文字列を完全に否定するための最も怠惰な最も便利な方法は何ですか?

ありがとう

編集済み:許可されている文字列の例: xxxxxxx yyyyyyyyy yxxxx yyyyyyxx

許可されていない文字列の例: xxxxyxxx xyxxxx yyyyxyyy yyyxyxy など

4

3 に答える 3

3

私がこの課題を正しく理解していれば、あなたは任意の数の y で始まり、その後に任意の数の x が続く文字列の言語を記述しています。これは、許可されている文字は 2 つだけであり、x の後に y を配置することはできません。文字列「xy」が表示されるためです。

\by*x*\b

もちろん、実際には、あなたが与えたものほど単純ではないケースに対して、より一般的な解決策を探していると思います. その場合、否定的な先読みアサーションが最も簡単な解決策です。

于 2012-04-24T08:48:54.467 に答える
1

否定的な先読みを使用する

\b((?!xy)[xy])+\b
于 2012-04-24T08:46:34.140 に答える
0

試す:

\bx[^xy\s]*y\b

説明:

<!--
\bx[^xy\s]*y\b

Options: ^ and $ match at line breaks

Assert position at a word boundary «\b»
Match the character “x” literally «x»
Match a single character NOT present in the list below «[^xy\s]*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
   One of the characters “xy” «xy»
   A whitespace character (spaces, tabs, and line breaks) «\s»
Match the character “y” literally «y»
Assert position at a word boundary «\b»
-->
于 2012-04-24T08:51:49.410 に答える