Регулярное выражение для соответствия строке, содержащей два имени в любом порядке

function isAssoc($arr)
{
    $a = array_keys($arr);
    for($i = 0, $t = count($a); $i < $t; $i++)
    {
        if($a[$i] != $i)
        {
            return false;
        }
    }
    return true;
}
146
задан codaddict 9 December 2010 в 02:48
поделиться

2 ответа

МЕТОД 1: Один jack и Один james

На всякий случай, два jack или два james не был бы позволен, только один jack и один james будут допустимы, мы можем, вероятно, разработать выражение, подобное:

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$

Здесь, мы исключили бы те парные экземпляры использование, эти операторы:

(?!.*\bjack\b.*\bjack\b)

и,

(?!.*\bjames\b.*\bjames\b)

Демонстрация RegEx 1

Мы можем также упростить это до,

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

Демонстрация RegEx 2

<час>

, Если Вы хотите упростить/изменить/исследовать выражение, это было объяснено на верхней правой панели [1 119] regex101.com . Если бы Вы хотели бы, можно также смотреть в [1 120] эта ссылка , как она соответствовала бы против некоторых демонстрационных исходных данных.

<час>

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

Тест

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 matches
    if (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}`);
    });
}
<час>

МЕТОД 2: Один jack и Один james в определенном порядке

Это может быть также разработано для первого james последний jack, подобный следующему:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$

Демонстрация RegEx 3

и наоборот:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

Демонстрация RegEx 4

0
ответ дан 23 November 2019 в 22:41
поделиться

Vim имеет оператор \& ответвления, который полезен при поиске строки, содержащей ряд слов в любом порядке. Кроме того, расширение набора необходимых слов тривиально.

, Например,

/.*jack\&.*james

будет соответствовать строке, содержащей jack и james, в любом порядке.

См. этот ответ для получения дополнительной информации об использовании. Я не знаю ни о какой другой regex разновидности, которая реализует ветвление; оператор даже не документируется на Регулярное выражение статья в Википедии.

0
ответ дан 23 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: