Разработка регулярных выражений для специальной строки - PullRequest
0 голосов
/ 18 апреля 2019

Невозможно реализовать регулярное выражение для строки в строке, начинается с ? и заканчивается ; с добавлением одинарных или двойных кавычек.

, например:

?abcdef;
'?abcdef;'
"?abcdef;" 

Я пыталсяочень похоже на "^\\?([^;]+)\\;$", но это не сработало.

Фрагмент кода теста:

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

public class RegexTest {

    public static void main(final String[] args) {

        final String text = "This is param-start ?abcdef; param-end";

        final String patternString = "(['\"]?)\\?.*;\\1";

        final Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
        final Matcher matcher = pattern.matcher(text);

        System.out.println("lookingAt = " + matcher.lookingAt());
        System.out.println("matches   = " + matcher.matches());
    }
}

Ответы [ 3 ]

5 голосов
/ 18 апреля 2019

Вы можете использовать это регулярное выражение:

(["']?)\?.*;\1

Для использования на Java:

final String pattern = "(['\"]?)\\?.*;\\1";

RegEx Demo

  • (["']?) соответствует необязательно ' или " и захватывает в группе # 1
  • \1 обратная ссылка для того же значения, что и в группе # 1
1 голос
/ 18 апреля 2019

Вы можете использовать

final String text = "This is param-start ?abcdef; param-end";
final String patternString = "(['\"]?)\\?.*?;\\1";
final Pattern pattern = Pattern.compile(patternString, Pattern.DOTALL);
final Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println("Match found: " + matcher.group());
}
// => Match found: = ?abcdef;

См. Демонстрационную версию Java и демонстрационную версию regex . Регулексный график:

enter image description here

Примечания

  • while (matcher.find()) - перебирает все потенциальные совпадения в строке
  • matcher.group() - доступ к значению совпадения.

Regex

  • (['"]?) - Группа захвата 1: либо ', либо "
  • \? - ? char
  • .*? - любые 0+ символов, как можно меньше (шаблон скомпилирован с Pattern.DOTALL, поэтому он будет совпадать и через разрывы строк)
  • ; - точка с запятой
  • \1 - то же значение, что и в группе 1.
0 голосов
/ 18 апреля 2019

В вашем описании указано «начинается с? И заканчивается;», но образец строки не заканчивается точкой с запятой - он заканчивается двойной кавычкой.

Если вы хотите, чтобы строка начиналасьили заканчиваться одинарной или двойной кавычкой, ваше совпадение должно быть: ^['"]?\?[^;]+;\['"]?$

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