Попытка найти вхождение числа, сопровождаемого запятой, используя регулярное выражение - PullRequest
0 голосов
/ 27 сентября 2018

Это строка, которую я пытаюсь проверить с помощью регулярного выражения: var mString = "14 90,".Я хочу проверить, содержит ли строка вхождение набора чисел, за которым следует запятая, в этом случае 90,

У меня есть этот шаблон регулярного выражения:

var pattern: Pattern = Pattern.compile(".*/([0-9]+,)+/g.*")

Но при оценкестрока, которую он возвращает false:

if(pattern.matcher(mString).find()){
        //found it!
}

Что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Шаблоны Java не применяют ни модификаторы, ни контексты внутри самой строки регулярного выражения.С ".*/([0-9]+,)+/g.*" похоже, что вы пытаетесь применить выражение глобально в режиме g.Если вы хотите применить модификаторы, вы должны добавить их в качестве второго аргумента к Pattern.compile:

Pattern.compile(".*([0-9]+,).*", Pattern.DOTALL)

В вашем случае вам, вероятно, не нужны модификаторы режима.Просто используйте .*([0-9]+,).* в качестве регулярного выражения:

if (mString.matches(".*([0-9]+,).*")) {
    // Found it!
}

Обновление:

Я изначально полагал, что встроенные модификаторы были недоступны в Java, но оказывается, что java.util.Patternна самом деле поддерживает встроенные модификаторы.Это задокументировано в первом комментарии в стиле Javadoc в классе Pattern:

<code>   /**
    * Regular expression modifier values.  Instead of being passed as
    * arguments, they can also be passed as inline modifiers.
    * For example, the following statements have the same effect.
    * <pre>
    * RegExp r1 = RegExp.compile("abc", Pattern.I|Pattern.M);
    * RegExp r2 = RegExp.compile("(?im)abc", 0);
    * 
* * Флаги продублированы, так что знакомые имена Perl-флагов * доступны.* /

Дополнительные сведения о том, какой символ использовать для каждого модификатора, можно найти на каждой константе модификатора в том же классе.Например, Pattern.DOTALL можно включить с помощью выражения (?s).

0 голосов
/ 27 сентября 2018

Ваш ".*/([0-9]+,)+/g.*" является "разрушенным", испорченным шаблоном, так как вы включили .*/ и /g.* по ошибке.Смысл в том, чтобы искать [0-9]+, (или даже [0-9],) в любом месте строки.

Вы можете использовать шаблон типа [0-9], и использовать Kotlin contains() метод или Java Matcher#find(), передав регулярное выражение методу:

var mString = "14 90,"
var pattern = "[0-9]+,".toRegex()
if(mString.contains(pattern)){
    println("Valid")
}

См. Kotlin demo .

Здесь pattern создается как экземпляр класса Regex, а объект регулярного выражения передается методу contains.

Java-код :

if (Pattern.compile("[0-9],").matcher(s).find()) {
    System.out.println("Matched");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...