Como o operador AND / OR é representado como em Expressões regulares?

219

No momento, estou programando um algoritmo de vocabulário que verifica se um usuário digitou a palavra corretamente. Eu tenho a seguinte situação: A solução correta para a palavra seria "parte1, parte2". O usuário deve poder inserir "parte1" (resposta 1), "parte2" (resposta 2) ou "parte1, parte2" (resposta 3). Agora, tento corresponder a sequência fornecida pelo usuário com a seguinte expressão de regex criada automaticamente:

^(part1|part2)$

Isso retorna as respostas 1 e 2 apenas como corretas, enquanto a resposta 3 estaria errada. Agora estou me perguntando se existe um operador semelhante ao | isso diz em and/orvez de either...or.

Alguém pode me ajudar a resolver esse problema?

Jonathan
fonte
1
Expressões regulares podem não ser a melhor solução para isso. Eu usaria métodos de string normais.
precisa
3
Esse problema está mal especificado. Por que você está usando a correspondência de padrões quando tudo o que precisa é de uma comparação exata de cadeias com um conjunto de cadeias legais? A menos que seu compilador regex otimize alternativas em uma estrutura O (1) trie da maneira que o Perl, você provavelmente deve estar fazendo um teste contra a associação de hash. Outros mecanismos de regex simplesmente não são muito inteligentes nisso.
precisa saber é o seguinte
@tchrist O caso de uso pode ser uma $orcorrespondência de mongodb regex #
Nadir Abbas

Respostas:

283

Eu vou assumir que você deseja criar um regex dinamicamente para conter outras palavras além de parte1 e parte2, e que você deseja que a ordem não seja importante. Nesse caso, você pode usar algo como isto:

((^|, )(part1|part2|part3))+$

Correspondências positivas:

part1
part2, part1
part1, part2, part3

Correspondências negativas:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
Gaute Løken
fonte
4
Observe que "parte1, parte" 1 também será positiva. O que nem sempre é desejável
dimaaan
1
@dimaaan Você perdeu suas citações? "parte1, parte1" será uma correspondência, mas "parte1, parte" não será. Embora você esteja certo de que esse cenário não é coberto por esta solução, para a aplicação do OP em que ele verifica se a cadeia de teste consiste em palavras em um vocabulário, acredito que ele deseja uma correspondência positiva, mesmo quando uma palavra é repetido. A palavra ainda fará parte do vocabulário, não importa quantas instâncias você tenha.
Gaute Løken
30
'^(part1|part2|part1,part2)$'

funciona?

Kent
fonte
1
Obviamente. o regex exige a corda toda para corresponder (^, $)
glasspill
5

Isso funciona sem alternância?

^((part)1(, \22)?)?(part2)?$

ou por que não isso?

^((part)1(, (\22))?)?(\4)?$

O primeiro funciona para todas as condições, o segundo para todos, exceto part2(usando o GNU sed 4.1.5)

potong
fonte
4

Não é um especialista em regex, mas você pode fazer ^((part1|part2)|(part1, part2))$. Em palavras: "parte 1 ou parte2 ou ambos"

Urso preto
fonte
2

Ou você pode usar isso:

^(?:part[12]|(part)1,\12)$
FailedDev
fonte