Непонимание с помощью метода asBoolean класса Matcher - PullRequest
0 голосов
/ 22 октября 2018

У меня проблема с крошечным тестовым скриптом:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

cfgText = "PATTERN1 = 9\nPATTERN2 = 136.225.73.44\nPATTERN3 = 136.225.236.12"

cfgLine = cfgText.split('\n');
def p = /.*PATTERN2.*/;
def PATTERN2_found = false;
for (i=0; PATTERN2_found==false && i < cfgLine.length; i++)
{
    println("cfgLine" +i+ ": " + cfgLine[i]);
    def m = cfgLine[i] =~ p;
    println("m: " + m)
    println("m.asBoolean(): " + m.asBoolean());
    println("m: " + m)
    println("m.asBoolean(): " + m.asBoolean());
    if(m.asBoolean()){
        println("Heeeyyyy");
    }
    println("--------------------------------");
}

Это его вывод:

cfgLine0: PATTERN1 = 9
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,12 lastmatch=]
m.asBoolean(): false
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,12 lastmatch=]
m.asBoolean(): false
--------------------------------
cfgLine1: PATTERN2 = 136.225.73.44
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=]
m.asBoolean(): true
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=PATTERN2 = 136.225.73.44]
m.asBoolean(): false
--------------------------------
cfgLine2: PATTERN3 = 136.225.236.12
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,25 lastmatch=]
m.asBoolean(): false
m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,25 lastmatch=]
m.asBoolean(): false
--------------------------------

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedConstructor$1 (file:/usr/share/groovy/lib/groovy-2.4.15.jar) to constructor java.util.regex.Matcher()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedConstructor$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Как вы можете видеть совпадения регулярного выражения во втором цикле, ноповедение странно для меня.Я действительно не знаю, почему, если я использую ДВА asBoolean против одного и того же объекта Matcher, результат будет другим.Есть ли у него внутренний итератор или что-то в этом роде?

PS: я решил это с помощью оператора ==~, но я хотел бы знать, почему asBoolean работает так.

1 Ответ

0 голосов
/ 22 октября 2018

Это происходит потому, что StringGroovyMethods.asBoolean(Matcher matcher) вызывает matcher.find(), который изменяет внутреннее состояние устройства сопоставления.

/**
 * Coerce a Matcher instance to a boolean value.
 *
 * @param matcher the matcher
 * @return the boolean value
 * @since 1.7.0
 */
public static boolean asBoolean(Matcher matcher) {
    if (null == matcher) {
        return false;
    }

    RegexSupport.setLastMatcher(matcher);
    return matcher.find();
}

Источник: src / main / org / codehaus /groovy / runtime / StringGroovyMethods.java

Именно поэтому при первом вызове m.asBoolean() возвращается true, поскольку его состояние до этого вызова было (нетнайдено совпадение):

m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=]

И теперь, когда вы вызываете m.asBoolean() во второй раз, объект соответствия изменяется при предыдущем вызове и представляется как:

m: java.util.regex.Matcher[pattern=.*PATTERN2.* region=0,24 lastmatch=PATTERN2 = 136.225.73.44]

И этовозвращает false, потому что нет другой части, удовлетворяющей сопоставителю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...