0

このsplit/Pattern.compileの場合、正規表現がどのように機能するかを理解しようとしています

これは文字列全体です。"#[flowVars['variable_name']]"

抽出する必要がある文字列は"variable_name"

どうすれば正規表現でこれを達成できますか? または、代わりに長い名前を付けても、別の"flowVars"ものになる可能性があります。

編集:

誰かがそれを再利用または変更したい場合に備えて、分割を使用して2回反復して引用符間のすべての一致/変数を見つけるメソッドを構築しました

private static List<String> rebuildURLWithComplexValues(String url) {

    List<String> tokens = new ArrayList<String>();;

    if(url != null && url.length() > 0) {
        if(url.contains("flowVars")) {              
            String[] firstSplit = url.split("\\[");
            for (int i = 0; i < firstSplit.length; i++) {
                if(firstSplit[i].contains("'")) {
                    StringTokenizer st = new StringTokenizer(firstSplit[i], "\'");                      
                    String tokencitu = st.nextToken();
                    tokens.add(tokencitu);
                }
            }
        }
    }
    return tokens;
}

みんなありがとう:D

4

4 に答える 4

2

他の人が述べたように、より多くの情報が必要ですが、サンプルに基づいた最も簡単な方法は、すべてを一重引用符で囲むことです。

String input = "#[flowVars['variable_name']]";
System.out.println(input.replaceAll(".*'(.*)'.*", "$1"));

これは次のように変換されます: 何でも ( .*)、その後に一重引用符 ( ')、その後に何か ( ) のキャプチャされたブロックが(.*)続き、その後に一重引用符が続き、その後に何かが続き、それを取り、キャプチャされたブロックに置き換えます。

それをいじりたい場合は、試してください:

http://regexr.com?35kof

たとえば、複数のキャプチャ ブロックを使用できます。それらを順番に参照するだけです ($1最初のキャプチャ ブロック、$22 番目のキャプチャ ブロックなど)。

System.out.println(input.replaceAll("(.*)'(.*)'(.*)", "$2, $1, $3"));

次のように、選択する変数が複数ある場合:

String input = "#[flowVars['variable_name1']]#[flowVars['variable_name2']]";

Java のPatternandMatcherを次の正規表現で使用できます。

String regex = "(?<=#\[flowVars\[')[^']*";

これは次のように変換されます: "#[flowVars['" で始まるが、 match(?<=#\[flowVars\[')にそれを含まないもの、その後に多くの非引用符が続きます[^'](これにより、最初に表示される引用符まですべてが得られます)。

そこからマッチャーのグループをループするだけで、ネストされたループは必要ありません。

于 2013-07-18T19:39:54.497 に答える
0

あなたが探しているのは、正規表現を介して分割するのではなく、正規表現から一致を取得することだと思います。この正規表現は目的に合わせて機能するはずです。

"#\[[A-Za-z]+\['([A-Za-z_]+)']]"

[A-Za-z] の括弧はキャプチャと呼ばれるものです。基本的に、括弧内にあるものは何でも取り、後でアクセスできるようにします。正規表現自体を理解していない場合は、こちらを参照してください。もしそうなら、私は以下のキャプチャピースを説明します.

キャプチャ グループの部分は次のように機能します。

Pattern p = Pattern.compile("#\[[A-Za-z]+\['([A-Za-z_]+)']]");
Matcher m = p.matcher("#[flowVars['variable_name']]");

そこから、呼び出してキャプチャ グループを取得できます。

string output = m.group(1);

0 番目のインデックスには一致した文字列全体が含まれているため、キャプチャ グループはインデックス 1 から始まります。

これが役に立ったことを願っています!

于 2013-07-18T19:39:47.500 に答える
0

これを試して

 String str="#[flowVars['variable_name']]";
  Pattern p=Pattern.compile("\\['.*?']");
  Matcher m=p.matcher(str);
    if(m.find()){              
        System.out.println(m.group(0).replaceAll("\\['","").replaceAll("\\']",""));
    }
于 2013-07-18T19:46:21.200 に答える