2

私が渡したいものの例は次のとおりです。

  1. 「..」
  2. 「ああ」
  3. 「ああ*」
  4. "何とか何とか"
  5. 「何とか何とか*」
  6. [@attrib="value"]または[@attrib="value" and @attrib2="value2" and ...] を末尾に追加した2 ~ 5 (NOT 1) のいずれか

私が渡したくないものの例は次のとおりです。

  1. ""
  2. 「。」
  3. " "
  4. 「……」
  5. 「.blah」
  6. 「-何とか」

基本的に「..」が欲しい

また

ドットまたはダッシュを含むがそれらで始まらない az の文字列 (オプションで * が続きます) (オプションで属性/値のリストが続きます)

グループは次のとおりです。

  1. ".." またはドット/ダッシュを含むが先頭にない文字列 az
  2. "*" または一致しない場合は StringUtils.EMPTY
  3. 属性のグループ、または一致しない場合は StringUtils.EMPTY

私が現在持っている正規表現は次のとおりです。

"^([a-z]+[a-z.\\-]*)([\\*]*)[\\[]*([^\\]]*)[\\]]*"

...「..」だけの場合、または最初のグループが文字で始まり、ドットまたはダッシュで終わる場合、これは機能しません。これらの 2 つのケースで機能させるために私がやろうとしたことはすべて、全体を台無しにしてしまいました。

すべての助けに感謝します。

以下のコメントの正規表現を介して、この正規表現で動作するコードを少し変更すると、「..」で動作しますが、文字のみで終わる最初のグループではまだ動作していません。そのグループの最後に [az]+$ を追加してみました:

"^(\\.\\.|^([a-z]+[a-z.\\-]*[a-z]+$)([\\*]*)[\\[]*([^\\]]*)[\\]]*)$"

...しかし、それは後者のグループで問題を引き起こします

4

1 に答える 1

0

この正規表現は、質問で指定された要件を満たしているようです:

^(?:(\.{2})|([a-z]+\.?[a-z]*\*?)\s?\[?(?:(@\w+="\w+")(?:\sand\s)?)*\]?)$

開始/終了行のアサーションを作成できると想定しています。これは、試行中に作成しているためです。そうでない場合は、先頭と末尾の「^」と「$」をそれぞれ削除します。

Java では、次のコードを使用して実行します。

Pattern regex = Pattern.compile("^(?:(\\.{2})|([a-z]+\\.?[a-z]*\\*?)\\s?\\[?(?:(@\\w+=\"\\w+\")(?:\\sand\\s)?)*\\]?)$", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher matcher = regex.matcher("target string");
if (matcher.matches()) {
    for (int i = 1; i <= matcher.groupCount(); i++) {
        String targetGroup = matcher.group(i)
    }
} 

お役に立てれば。

于 2012-08-20T00:23:22.233 に答える