response-native-keyboard-aware-scroll-view решила проблему для меня. реагировать-родной-клавиатурой-прокрутки-просмотр на GitHub
Можно сделать это с единственным regex, но я предлагаю ради удобочитаемости, как которая Вы делаете что-то...
(/foo/ and not /bar/) || (/bar/ and not /foo/)
Вы могли бы хотеть рассмотреть? условный тест.
(?(?=regex)then|else)
Если Ваш regex язык поддерживает его, используйте отрицательный lookaround:
(?<!foo|bar)(foo|bar)(?!foo|bar)
Это будет соответствовать "нечто" или "панели", которой сразу не предшествуют или сопровождают "нечто" или "панель", которая я думаю, то, что Вы хотели.
не ясно из Вашего вопроса или примеров, если строка, которой Вы пытаетесь соответствовать, может содержать другие маркеры: "foocuzbar". Если так, этот шаблон не будет работать.
Вот результаты Ваших тестовых сценариев ("верный", означает, что шаблон был найден во входе):
foo: true
bar: true
foofoo: false
barfoo: false
foobarfoo: false
barbar: false
barfoofoo: false
Вы не определили поведение относительно содержания кроме "нечто" и "панели" или повторений одного в отсутствие другого. например, Должен" нечто 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
...
}
, Если несколько повторений той же самой цели позволяются (т.е. "варварские" соответствия), то этот тот же общий подход мог использоваться к тому времени, обходя список соответствий, чтобы видеть, являются ли соответствия всеми повторениями того же текста или если другая опция также присутствует.
Если бы Вы хотите истинное эксклюзивное или, я просто сделал бы это в коде вместо в 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)
Используя границы слова, можно получить отдельное слово...
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"
Я использовал бы что-то вроде этого. Это просто проверяет на пространство вокруг слов, но Вы могли использовать \b
или \B
для проверки на границу, если Вы используете \w
. Это соответствовало бы "нечто" или "панели", так очевидно, необходимо будет заменить пробел также на всякий случай. (Принятие Вы заменяете что-либо.)
/\s((foo)|(bar))\s/
Я не думаю, что это может быть сделано с единственным регулярным выражением. И границы могут или не могут работать в зависимости от того, против чего Вы соответствуете.
я соответствовал бы против каждого regex отдельно и сделал бы XOR на результатах.
foo = re.search("foo", str) != None
bar = re.search("bar", str) != None
if foo ^ bar:
# do someting...
Я попробовал тренером Regex против:
x foo y
x bar y
x foobar y
, Если я проверяю g
опция, действительно она распознает все три слова, потому что она ищет снова после каждого соответствия.
, Если Вы не хотите это поведение, можно привязать выражение, например, соответствуя только на границах слова:
\b(foo|bar)\b
Предоставление большего количества контекста на проблеме (на что похожи данные) могло бы дать лучшие ответы.
\b(foo)\b|\b(bar)\b
И использование только первое группа .
получения