@AndersonGreen, вопрос был преждевременно заблокирован. Ответы крайне отсутствуют, так как эти решения нежизнеспособны, так как большинство регулярных выражений не распознают обходной и модовый квантификаторы . Я считаю, что квантификатор существовал в момент задаваемого вопроса.
XPMai
Ответы:
261
Вы можете делать проверки, используя обходные пути :
Кто-нибудь знает, почему это может прерваться (по крайней мере, в JavaScript), когда я пытаюсь найти строки, начинающиеся с '#'? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$не соответствует, blah #tgif blah #friday blahно ^(?=.*\bfriday\b)(?=.*\btgif\b).*$работает нормально.
Принятый ответ сработал. это также отлично сработало для меня. Для поиска кода в визуальной студии «найти результаты».
Йогурт Мудрый
1
Этот работает для меня и является намного более кратким и легким для понимания, чем принятый ответ!
Кумар Маниш
1
Мне нужно было решение, в котором должны были совпадать только два имени, поэтому этот ответ является более кратким для этого случая. Но принятый ответ становится более кратким за пределами 2, так как число «или» увеличивается факториально. Для 3 имен будет 6 "или" s, 4 имени будет 24 "или" s, и т. Д.
WileCau
Я бы порекомендовал сделать это ленивым james.*?jack|jack.*?james. Это поможет на больших текстах.
Джекис
42
Объяснение команды, которую я собираюсь написать : -
. означает любой символ, цифра может прийти вместо.
* означает ноль или более вхождений вещи, написанной как раз перед ней.
|означает «или» .
Так,
james.*jack
будет искать james , то любое количество символов, пока не jackпридет.
В качестве примечания: вы могли бы также отредактировать ответ @ icyrock (который совпадает с вашим, всего 6 лет назад), ваше объяснение само по себе очень полезно.
WoJ
2
Спасибо за этот ответ, однако я чувствую необходимость указать, что в поиске VSCode ваш ответ jack. * James | Джеймс. * Джек займет пробел между '|' (или) символ учитывается при поиске. Джек. * Джеймс | Джеймс. * Джек работает и не ищет пробелы
jgritten
2
ЕСЛИ $ _explanation === "круто", ТО вернуть $ THUMBS_UP ENDIF;
В Vim есть оператор ветвления, \&который полезен при поиске строки, содержащей набор слов в любом порядке. Более того, расширение набора необходимых слов тривиально.
Например,
/.*jack\&.*james
будет соответствовать строке, содержащей jackи james, в любом порядке.
Смотрите этот ответ для получения дополнительной информации об использовании. Я не знаю ни одного другого варианта регулярного выражения, который реализует ветвление; оператор даже не задокументирован в записи Википедии о регулярных выражениях .
Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . Если вы хотите, вы также можете посмотреть в этой ссылке , как она будет сопоставляться с некоторыми примерами входных данных.
const regex =/^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;const str =`hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;let m;while((m = regex.exec(str))!==null){// This is necessary to avoid infinite loops with zero-width matchesif(m.index === regex.lastIndex){
regex.lastIndex++;}// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex)=>{
console.log(`Found match, group ${groupIndex}: ${match}`);});}
Ответы:
Вы можете делать проверки, используя обходные пути :
Попробуй это.
Этот подход имеет то преимущество, что вы можете легко указать несколько условий.
источник
vim
синтаксис:^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
или\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
не соответствует,blah #tgif blah #friday blah
но^(?=.*\bfriday\b)(?=.*\btgif\b).*$
работает нормально.\b
значит здесь?Пытаться:
Если вы хотите оба одновременно, то
or
их:источник
james.*?jack|jack.*?james
. Это поможет на больших текстах.Объяснение команды, которую я собираюсь написать : -
.
означает любой символ, цифра может прийти вместо.*
означает ноль или более вхождений вещи, написанной как раз перед ней.|
означает «или» .Так,
будет искать
james
, то любое количество символов, пока неjack
придет.Так как вы хотите
jack.*james
илиjames.*jack
Отсюда и команда :
источник
Его короткая и сладкая
источник
Ты можешь сделать:
источник
В Vim есть оператор ветвления,
\&
который полезен при поиске строки, содержащей набор слов в любом порядке. Более того, расширение набора необходимых слов тривиально.Например,
/.*jack\&.*james
будет соответствовать строке, содержащей
jack
иjames
, в любом порядке.Смотрите этот ответ для получения дополнительной информации об использовании. Я не знаю ни одного другого варианта регулярного выражения, который реализует ветвление; оператор даже не задокументирован в записи Википедии о регулярных выражениях .
источник
МЕТОД 1: Один
jack
и Одинjames
На всякий случай, если два
jack
или дваjames
не будут разрешены, допустимы только одинjack
и одинjames
, мы можем разработать выражение, подобное:Здесь мы исключили бы эти пару экземпляров, используя эти операторы:
и,
RegEx Demo 1
Мы также можем упростить это,
RegEx Demo 2
Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . Если вы хотите, вы также можете посмотреть в этой ссылке , как она будет сопоставляться с некоторыми примерами входных данных.
RegEx Circuit
jex.im визуализирует регулярные выражения:
Тест
МЕТОД 2: Один
jack
и Одинjames
в определенном порядкеЭто может также быть разработано для первого
james
последнегоjack
, подобного следующему:RegEx Demo 3
и наоборот:
RegEx Demo 4
источник
Вы можете использовать функцию квантификатора регулярных выражений, поскольку она
lookaround
может поддерживаться не всегда.источник