0

私は次の問題を抱えており、私がやろうとしていることを達成するために可能な限り最悪のメカニズムを使用しているかどうかを誰かが教えてくれることを望んでいました:

解析する必要がある文字列は次のとおりです。

(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = "0"

j1、j2、f3、f4、f5、g、および基本的に括弧内のその他のものを個別の要素として取得できる必要があります

これが私がやっていることであり、思い通りに機能していません...

String parsedString="";
String delimiter = "[()s(f(d(t(n(v(&|]+");
String[] tokens = parseString.split(delimiterString);
List<String> listOfValues = new ArrayList<String>(Arrays.asList(tokens));
for (int i=0;i<listOfValues.size();i++)
{
    System.out.println("Value of "+i+"is "+listOfValues.get(i));
    if(listOfValues.get(i).equals("\r") || listOfValues.get(i).equals("")|| listOfValues.get(i).equals(" "))
    {
         listOfValues.remove(i);
     }
}

空白と改行も削除しようとしていますが、これを行うためのより良い方法がある場合 (明らかに私の方法が機能していません)、お知らせください。

4

4 に答える 4

2

これは役立つはずです:

String input = "(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = \"0\"";
String regex = "\\(([^(]+?)\\)";
Matcher matcher = Pattern.compile(regex).matcher(input);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}
于 2013-02-27T12:41:58.413 に答える
1

これを試すことができます:

Pattern p = Pattern.compile("[a-z]\\(([a-z0-9]+)\\)");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println(m.group(1));
}

入力で使用すると、次のように返されます。

j1
j2
f3
f4
f5
g
于 2013-02-27T12:44:11.367 に答える
1

深刻な再帰が含まれていない限り、正規表現は簡単な方法です。

String s =  "(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = \"0\"";

Pattern p = Pattern.compile("\\A.*?\\(([^\\(\\)][^\\(\\)]?)\\)(.*)\\z", Pattern.DOTALL);
List<String> listOfValues = new ArrayList<String>();

Matcher m = p.matcher(s);
while (m.matches())
{
    String toAdd = m.group(1);
    System.out.println("adding = " + toAdd);
    listOfValues.add(toAdd);
    s = m.group(2);
    m = p.matcher(s);
}
于 2013-02-27T12:53:22.677 に答える
1
    Pattern p = Pattern.compile("(?<=\\()[^ ()]+(?=\\))");
    Matcher m = p.matcher("(s(j1) | f(j2) | d(f3) | t(f4) | e(f5) = 5) & v(g) = \"0\"");
    while (m.find()) {
        System.out.println(m.group(0));
    }
于 2013-02-27T12:55:46.530 に答える