Эксклюзив или в регулярном выражении

response-native-keyboard-aware-scroll-view решила проблему для меня. реагировать-родной-клавиатурой-прокрутки-просмотр на GitHub

29
задан agc 15 December 2017 в 13:25
поделиться

10 ответов

Можно сделать это с единственным regex, но я предлагаю ради удобочитаемости, как которая Вы делаете что-то...

(/foo/ and not /bar/) || (/bar/ and not /foo/)
9
ответ дан Ed Guiness 15 December 2017 в 13:25
поделиться

Вы могли бы хотеть рассмотреть? условный тест.

(?(?=regex)then|else)

Условные выражения Регулярного выражения

2
ответ дан Josh 15 December 2017 в 13:25
поделиться

Если Ваш regex язык поддерживает его, используйте отрицательный lookaround:

(?<!foo|bar)(foo|bar)(?!foo|bar)

Это будет соответствовать "нечто" или "панели", которой сразу не предшествуют или сопровождают "нечто" или "панель", которая я думаю, то, что Вы хотели.

не ясно из Вашего вопроса или примеров, если строка, которой Вы пытаетесь соответствовать, может содержать другие маркеры: "foocuzbar". Если так, этот шаблон не будет работать.

Вот результаты Ваших тестовых сценариев ("верный", означает, что шаблон был найден во входе):

foo: true
bar: true
foofoo: false
barfoo: false
foobarfoo: false
barbar: false
barfoofoo: false
17
ответ дан erickson 15 December 2017 в 13:25
поделиться
  • 1
    Оборотная сторона: Потребности считать ЦЕЛЫЙ файл и присвоить КАЖДУЮ СТРОКУ awk переменным-> Это может быть вполне ЦП и IO интенсивный. – Jürgen Hötzel 17 April 2010 в 06:40

Вы не определили поведение относительно содержания кроме "нечто" и "панели" или повторений одного в отсутствие другого. например, Должен" нечто d" или" парикмахер ian" соответствие?

Предположение, что Вы хотите к строкам совпадения, которые содержат только один экземпляр или "нечто" или "панели", но не обоих и не нескольких экземпляров того же, не принимая во внимание что-либо еще в строке (т.е. "продовольственные" соответствия и "варвар" не соответствует), тогда Вы могли использовать regex, который возвращает количество найденных соответствий, и только считайте это успешным, если точно одно соответствие найдено. например, в Perl:

@matches = ($value =~ /(foo|bar)/g)  # @matches now hold all foos or bars present
if (scalar @matches == 1) {          # exactly one match found
  ...
}

, Если несколько повторений той же самой цели позволяются (т.е. "варварские" соответствия), то этот тот же общий подход мог использоваться к тому времени, обходя список соответствий, чтобы видеть, являются ли соответствия всеми повторениями того же текста или если другая опция также присутствует.

3
ответ дан Dave Sherohman 15 December 2017 в 13:25
поделиться

Если бы Вы хотите истинное эксклюзивное или, я просто сделал бы это в коде вместо в regex. В Perl:

/foo/ xor /bar/

, Но Ваш комментарий:

Соответствия: "нечто", несоответствия "панели": "foofoo" "barfoo" "foobarfoo" "barbar" "barfoofoo"

указывает, что Вы действительно не ищете эксклюзивный или. Вы на самом деле имеете в виду "/foo|bar/, соответствует точно однажды?"

my $matches = 0;
while (/foo|bar/g) {
  last if ++$matches > 1;
}

my $ok = ($matches == 1)
1
ответ дан cjm 15 December 2017 в 13:25
поделиться

Используя границы слова, можно получить отдельное слово...

me@home ~  
$ echo "Where is my bar of soap?" | egrep "\bfoo\b|\bbar\b"  
Where is my bar of soap?  

me@home ~  
$ echo "What the foo happened here?" | egrep "\bfoo\b|\bbar\b"  
What the foo happened here?  

me@home ~  
$ echo "Boy, that sure is foobar\!" | egrep "\bfoo\b|\bbar\b"  
0
ответ дан bill_the_loser 15 December 2017 в 13:25
поделиться

Я использовал бы что-то вроде этого. Это просто проверяет на пространство вокруг слов, но Вы могли использовать \b или \B для проверки на границу, если Вы используете \w. Это соответствовало бы "нечто" или "панели", так очевидно, необходимо будет заменить пробел также на всякий случай. (Принятие Вы заменяете что-либо.)

/\s((foo)|(bar))\s/
0
ответ дан Robert K 15 December 2017 в 13:25
поделиться

Я не думаю, что это может быть сделано с единственным регулярным выражением. И границы могут или не могут работать в зависимости от того, против чего Вы соответствуете.

я соответствовал бы против каждого regex отдельно и сделал бы XOR на результатах.

foo = re.search("foo", str) != None
bar = re.search("bar", str) != None
if foo ^ bar:
    # do someting...
0
ответ дан Can Berk Güder 15 December 2017 в 13:25
поделиться
  • 1
    или, вместо ' кошка rjh | grep "." | хвост-1' используйте ' grep. rjh | хвост-1' – amertune 15 April 2010 в 04:03

Я попробовал тренером Regex против:

x foo y
x bar y
x foobar y

, Если я проверяю g опция, действительно она распознает все три слова, потому что она ищет снова после каждого соответствия.
, Если Вы не хотите это поведение, можно привязать выражение, например, соответствуя только на границах слова:

\b(foo|bar)\b

Предоставление большего количества контекста на проблеме (на что похожи данные) могло бы дать лучшие ответы.

0
ответ дан PhiLho 15 December 2017 в 13:25
поделиться
\b(foo)\b|\b(bar)\b

И использование только первое группа .

получения
0
ответ дан Andrew Cowenhoven 15 December 2017 в 13:25
поделиться
Другие вопросы по тегам:

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