Eu sou novo em expressões regulares e gostaria de receber sua ajuda. Estou tentando montar uma expressão que dividirá a string de exemplo usando todos os espaços que não estão entre aspas simples ou duplas. Minha última tentativa é parecida com esta: (?!")
e não está funcionando bem. Está se dividindo no espaço antes da citação.
Exemplo de entrada:
This is a string that "will be" highlighted when your 'regular expression' matches something.
Saída desejada:
This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.
Observe isso "will be"
e 'regular expression'
mantenha o espaço entre as palavras.
Respostas:
Não entendo por que todos os outros estão propondo expressões regulares tão complexas ou códigos tão longos. Essencialmente, você deseja obter dois tipos de coisas de sua string: sequências de caracteres que não são espaços ou aspas e sequências de caracteres que começam e terminam com aspas, sem aspas entre dois tipos de aspas. Você pode combinar facilmente essas coisas com esta expressão regular:
Eu adicionei os grupos de captura porque você não quer as aspas na lista.
Este código Java constrói a lista, adicionando o grupo de captura se correspondesse para excluir as aspas e adicionando a correspondência de regex geral se o grupo de captura não correspondesse (uma palavra sem aspas foi correspondida).
Se você não se importa em ter as aspas na lista retornada, pode usar um código muito mais simples:
fonte
\"
?John's mother
resultados divididos em[John, s, mother]
"([^"]*)"|'([^']*)'|[^\s]+
."([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+
. Consulte stackoverflow.com/questions/5695240/…Existem várias questões no StackOverflow que cobrem essa mesma questão em vários contextos usando expressões regulares. Por exemplo:
ATUALIZAÇÃO : Exemplo de regex para lidar com strings entre aspas simples e duplas. Ref: Como posso dividir em uma string, exceto quando entre aspas?
Testei isso com um snippet Perl rápido e a saída foi reproduzida abaixo. Também funciona para strings vazias ou strings apenas com espaço em branco se estiverem entre aspas (não tenho certeza se isso é desejado ou não).
Observe que isso inclui os próprios caracteres de aspas nos valores correspondentes, embora você possa removê-los com uma substituição de string ou modificar o regex para não incluí-los. Vou deixar isso como um exercício para o leitor ou outro pôster por enquanto, já que 2 da manhã é tarde demais para mexer mais com as expressões regulares;)
fonte
Se quiser permitir aspas com escape dentro da string, você pode usar algo assim:
As sequências entre aspas serão o grupo 2, as palavras não citadas simples serão o grupo 3.
Você pode tentar em várias strings aqui: http://www.fileformat.info/tool/regex.htm ou http://gskinner.com/RegExr/
fonte
A regex de Jan Goyvaerts é a melhor solução que encontrei até agora, mas também cria correspondências vazias (nulas), que ele exclui em seu programa. Essas correspondências vazias também aparecem em testadores de regex (por exemplo, rubular.com). Se você girar as pesquisas (primeiro procure as partes citadas e, em seguida, as palavras separadas por espaço), você pode fazer isso uma vez com:
fonte
Isso irá corresponder aos espaços não entre aspas duplas. Tenho que usar min, max {0,99999} porque o Java não oferece suporte * e + em lookbehind.
fonte
Provavelmente será mais fácil pesquisar a string, agarrando cada parte, do que dividi-la.
A razão é que você pode dividi-lo nos espaços antes e depois
"will be"
. Mas, não consigo pensar em nenhuma maneira de especificar ignorando o espaço entre dentro de uma divisão.(não Java real)
Além disso, capturar aspas simples pode levar a problemas:
fonte
String.split()
não é útil aqui porque não há como distinguir entre espaços entre aspas (não dividir) e aqueles fora (dividir).Matcher.lookingAt()
é provavelmente o que você precisa:que produz a seguinte saída:
fonte
Eu gostei da abordagem de Marcus, no entanto, eu a modifiquei para que pudesse permitir texto perto das aspas e suportar ambos os caracteres de aspas "e '. Por exemplo, eu precisava de a =" algum valor "para não dividi-lo em [a =," algum valor "].
fonte
A abordagem de Jan é ótima, mas aqui está outra para registro.
Se você realmente deseja dividir conforme mencionado no título, mantendo as aspas entre
"will be"
e'regular expression'
, então você pode usar este método que está diretamente fora de Corresponder (ou substituir) um padrão, exceto nas situações s1, s2, s3 etc.O regex:
As duas alternâncias esquerdas combinam completo
'quoted strings'
e"double-quoted strings"
. Iremos ignorar essas correspondências. O lado direito corresponde e captura espaços para o Grupo 1, e sabemos que eles são os espaços certos porque não foram correspondidos pelas expressões à esquerda. Substituímos aqueles por eSplitHere
depois partimosSplitHere
. Novamente, este é um verdadeiro caso de divisão onde você deseja"will be"
, nãowill be
.Aqui está uma implementação funcional completa (veja os resultados na demonstração online ).
fonte
Se você estiver usando c #, você pode usar
Eu adicionei especificamente " | <(? [\ W \ s] *)> " para destacar que você pode especificar qualquer caractere para agrupar frases. (Neste caso, estou usando <> para agrupar.
O resultado é:
fonte
Estou razoavelmente certo de que isso não é possível usando apenas expressões regulares. Verificar se algo está contido em alguma outra tag é uma operação de análise. Este parece ser o mesmo problema de tentar analisar XML com um regex - não pode ser feito corretamente. Você pode conseguir o resultado desejado aplicando repetidamente um regex não ganancioso e não global que corresponda às strings entre aspas e, uma vez que não consiga encontrar mais nada, divida-o nos espaços ... que tem um número de problemas, incluindo o controle da ordem original de todas as substrings. Sua melhor aposta é apenas escrever uma função realmente simples que itera sobre a string e retire os tokens que você deseja.
fonte
Alguns ajustes úteis na resposta aceita de Jan:
fonte
you're
Você também pode tentar isso:
fonte
O seguinte retorna uma matriz de argumentos. Os argumentos são a variável 'comando' dividida em espaços, a menos que incluídos entre aspas simples ou duplas. As correspondências são então modificadas para remover as aspas simples e duplas.
fonte
1º one-liner usando String.split ()
[This, is, a, string, that, "will be", highlighted, when, your, 'regular expression', matches, something.]
não divida no espaço em branco se o espaço em branco estiver entre aspas simples ou duplas
divida no espaço em branco quando os 255 caracteres à esquerda e todos os caracteres à direita do espaço não forem aspas simples ou duplas
adaptado da postagem original (lida apenas com aspas duplas)
fonte