Проверка наличия только одной вертикальной черты | в строке? используя регулярное выражение

1

Таким образом, у меня есть тот же пример, который задан, и это xml содержит такие вещи, как следующая разметка mediawiki:

"... собранный в XII веке, из которых [[Александр Великий]] был героем и в котором он был представлен, несколько похожим на англичан [[Артур Артур]]"

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

Pattern p = Pattern.compile("\\[\\[([\\w | \\w]+)\\]\\]");

Он работает нормально, и я получаю этот результат:

Alexander the Great
King Arthur|Arthur

Проблема: если бы у меня был такой текст, как [[Alexander|the |Great]] с двумя или несколькими вертикальными полосами, это не должно совпадать, но оно соответствует.

Поэтому я изменил свое регулярное выражение на соответствие только одной вертикальной панели, но не работал:

Pattern p = Pattern.compile("\\[\\[([\\w |? \\w]+)\\]\\]");
Теги:

2 ответа

1
Лучший ответ

Чтобы найти выражения внутри [[ и ]] которые содержат буквенно-цифровые символы, пробелы и ровно один канал, вы можете использовать следующее регулярное выражение

\[\[[\w ]+[\|]{1}[\w ]+\]\]

Однако это относится только к тем случаям, когда труба не является первым или последним символом, но, исходя из вашего вопроса, эта ситуация не должна возникать.

  • 1
    Если вы хотите одну или ни одну трубу, измените фигурные скобки на {0,1}
2

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

Pattern p = Pattern.compile("\\[\\[([\\w ]+\\|?[\\w ]*)\\]\\]");

или, как в комментариях от @fge:

Pattern p = Pattern.compile("\\[\\[([\\w ]+(?:\\|[\\w ])?)\\]\\]");
  • 0
    Другое решение будет (из строки Java) \[\[(\w+(?:|\w+)?\]\]
  • 0
    Рохит. Я проверил ваш, но получил java.util.regex.PatternSyntaxException: метасимвол висячих символов '?' около индекса 12 [[([\ w] + |? [\ w] *)]] ^
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню