Obviamente, você pode usar o |
(pipe?) Para representar OR
, mas existe uma maneira de representar AND
também?
Especificamente, eu gostaria de combinar parágrafos de texto que contenham TODAS uma determinada frase, mas em nenhuma ordem específica.
I'd like to match paragraphs of text
. 2. Contendo texto fora de ordem . O número 1 está aberto à interpretação. O número 2 pode ser feito de duas maneiras. Caminho 1:,(?:(?:(?(1)(?!))\b(phrase1)\b.*?|(?(2)(?!))\b(phrase2)\b.*?)){2}
Caminho 2:(?=.*\bphrase1\b)(?=.*\bphrase2\b)
onde, neste caso, a correspondência do parágrafo neste caso é indefinida até que a definição do parágrafo seja formalizada.Respostas:
Use uma expressão regular não consumidora.
A notação típica (ou seja, Perl / Java) é:
(?=
expr)
Isso significa "corresponder expr, mas depois continuar a correspondência no ponto de partida original".
Você pode fazer quantas delas quiser, e isso será um "e". Exemplo:
(?=match this expression)(?=match this too)(?=oh, and this)
Você pode até adicionar grupos de captura às expressões que não consomem, se precisar salvar alguns dados.
fonte
Você precisa usar o lookahead, como alguns dos outros respondentes disseram, mas o lookahead deve contabilizar outros caracteres entre a palavra-alvo e a posição atual de correspondência. Por exemplo:
O
.*
primeiro lookahead permite combinar o número de caracteres necessário antes de chegar a "word1". Em seguida, a posição da partida é redefinida e o segundo lookahead procura "word2". Redefina novamente e a parte final corresponde a "palavra3"; como é a última palavra que você está procurando, não é necessário que ele fique de cabeça para baixo, mas não dói.Para corresponder a um parágrafo inteiro, você precisa ancorar a regex nas duas extremidades e adicionar uma final
.*
para consumir os caracteres restantes. Usando a notação no estilo Perl, isso seria:O modificador 'm' é para o modo multilinha; permite que o
^
e$
corresponda aos limites do parágrafo ("limites da linha" na expressão regular). Nesse caso, é essencial que você não use o modificador 's', que permite que o metacaractere de ponto corresponda às novas linhas, bem como a todos os outros caracteres.Finalmente, você quer ter certeza de que está combinando palavras inteiras e não apenas fragmentos de palavras mais longas; portanto, é necessário adicionar limites de palavras:
fonte
.*
com[\s\S]*
em javascript se você tem novas linhas como.
no motor de regex de javascript não coincide com novas linhas e não pode ser feita para com modificadoresVeja este exemplo:
Temos dois regexps A e B e queremos combinar os dois, portanto, no pseudo-código, fica assim:
Pode ser escrito sem usar o operador AND assim:
no PCRE:
fonte
(?=expr)
não. Parece ser dependente da implementação.^
significa "início de string" na sintaxe regex?^
é negação apenas no início de uma classe de personagem. A menos que o CMake esteja fazendo algo realmente desagradável (a ponto de chamar sua linguagem de correspondência de padrões "regex" pode ser considerada enganosa ou incorreta), acho que o fato de que funcionou para você foi um acidente isolado.Você pode fazer isso com uma expressão regular, mas provavelmente desejará algo mais. Por exemplo, use vários regexp e combine-os em uma cláusula if.
Você pode enumerar todas as permutações possíveis com um regexp padrão, como este (corresponde a, bec em qualquer ordem):
No entanto, isso gera uma regexp muito longa e provavelmente ineficiente, se você tiver mais do que alguns termos.
Se você estiver usando alguma versão estendida do regexp, como Perl ou Java, eles terão melhores maneiras de fazer isso. Outras respostas sugeriram o uso de uma operação com lookahead positivo.
fonte
a(bc|cb)|b(ac|ca)|c(ab|ba)
. E o mais importante, você pode usá-lo com todo o sabor regex.O operador AND está implícito na sintaxe RegExp.
O operador OR deve ser especificado com um tubo.
O seguinte RegExp:
significa a letra
a
E a letrab
.Também trabalha com grupos:
significa o grupo
co
E o grupode
.Substituir AND (implícito) por um OR exigiria as seguintes linhas:
fonte
No seu caso, não é possível executar AND em vários resultados correspondentes? no pseudocódigo
fonte
Por que não usar awk?
com awk regex AND, OR importa é tão simples
fonte
Se você usar expressões regulares do Perl, poderá usar lookahead positivo:
Por exemplo
seriam números maiores que 100 e divisíveis por 5
fonte
Você pode canalizar sua saída para outro regex. Usando grep, você pode fazer o seguinte:
grep A | grep B
fonte
Além da resposta aceita
Vou lhe dar alguns exemplos práticos que deixarão as coisas mais claras para alguns de vocês. Por exemplo, digamos que temos essas três linhas de texto:
Veja a demonstração aqui DEMO
O que queremos fazer aqui é selecionar o sinal +, mas apenas se for depois de dois números com um espaço e se for antes de quatro números. Essas são as únicas restrições. Usaríamos essa expressão regular para alcançá-la:
Observe que se você separar a expressão, ela fornecerá resultados diferentes.
Ou talvez você queira selecionar algum texto entre as tags ... mas não as tags! Então você pode usar:
para este texto:
Veja a demonstração aqui DEMO
fonte
A ordem está sempre implícita na estrutura da expressão regular. Para realizar o que você deseja, você precisará corresponder a sequência de entrada várias vezes com diferentes expressões.
O que você deseja fazer não é possível com uma única regexp.
fonte
Use AND fora da expressão regular. No PHP, o operador lookahead não parecia funcionar para mim; em vez disso, usei este
O regex acima corresponderá se o tamanho da senha for de 3 caracteres ou mais e não houver espaços na senha.
fonte