2

特定のjspのすべてのケースの条件付き変数名を取得する必要がありますjspを1行ずつ読み取り、一致するものが見つかった2つのタイプのcondをチェックすると言う行のように特定のパターンを検索しています

       <c:if condition="Event ='Confirmation'">
       <c:if condition="Event1 = 'Confirmation' or Event2 = 'Action'or Event3 = 'Check'" .....>

望ましい結果は、すべてのcond変数の名前です-Event、Event1、Event2、Event3最初のケースのみを満たすパーサーを作成しましたが、2番目のケースの変数名を見つけることができません。両方を満たすパターンが必要です。

    String stringSearch = "<c:if";
    while ((line = bf.readLine()) != null) {
                // Increment the count and find the index of the word
                lineCount++;
                int indexfound = line.indexOf(stringSearch);

                if (indexfound > -1) {

                    Pattern pattern = Pattern
                            .compile(test=\"([\\!\\(]*)(.*?)([\\=\\)\\s\\.\\>\\[\\(]+?));

                    Matcher matcher = pattern.matcher(line);
                    if (matcher.find()) {

                        str = matcher.group(1);
                        hset.add(str);
                        counter++;

                    }
                }
4

2 に答える 2

0

私があなたの要件をよく理解していれば、これはうまくいくかもしれません:

("|\s+)!?(\w+?)\s*=\s*'.*?'

$2各条件に変数名を付けます。

それが何をするか:

("|\s+)"または1つ以上のスペース

!?オプション

(\w+?)1つ以上の単語文字(文字、数字、またはアンダースコア)(([A-Za-z]\w*)より正確になります)

\s*=\s*an =前後に0個以上のスペース

'.*?''および'内の0個以上の文字

2番目のキャプチャグループは(\ w +?)変数名を取得しています

に必要なエスケープを追加します\

編集:指定した追加の条件については、以下で十分な場合があります。

("|or\s+|and\s+)!?(\w+?)(\[\d+\]|\..*?)?\s*(!?=|>=?|<=?)\s*.*?

("|or\s+|and\s+)または「または」のに1つ以上のスペースまたは「および」の後に1つ以上のスペースが続く(ここでは、各式の部分または変数名の前に「」または「または」が続き、その後に1つ以上のスペースまたはその後1つ以上のスペースが続きます)

!?(\w+?)オプション1つ以上の単語文字が続く

(\[\d+\]|\..*?)?角かっこまたはドットとそれに続く0個以上の文字で囲まれた数値を構成するオプションの部分

(!?=|>=?|<=?)次の関係演算子のいずれか:=、!=、>、<、> =、<=

$2変数名を付けます。

ここで、2番目のキャプチャグループは(\w+?)変数名を取得し、3番目のキャプチャグループはサフィックスが存在する場合はそれを取得します(例:[2]in Event[2])。

条件を含む入力の場合Event.indexOf(2)=something、のみ$2を与えEventます。Event.indexOf(2)使用したい場合$2$3

于 2013-02-13T13:19:55.233 に答える
0

これはあなたのニーズに合うかもしれません:

"(\\w+)\\s*=\\s*(?!\")"

つまり:

Every word followed by a = that isn't followed by a "

例えば:

String s = "<c:if condition=\"Event ='Confirmation'\"><c:if condition=\"Event1 = 'Confirmation' or Event2 = 'Action'or Event3 = 'Check'\" .....>";
Pattern p = Pattern.compile("(\\w+)\\s*=\\s*(?!\")");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}

版画:

Event
Event1
Event2
Event3
于 2013-02-14T08:40:13.610 に答える