Exemplo: "Esta é apenas uma sentença simples".
Eu quero combinar todos os caracteres entre "This is" e "sentença". Quebras de linha devem ser ignoradas. Não consigo descobrir a sintaxe correta.
Exemplo: "Esta é apenas uma sentença simples".
Eu quero combinar todos os caracteres entre "This is" e "sentença". Quebras de linha devem ser ignoradas. Não consigo descobrir a sintaxe correta.
Respostas:
Por exemplo
(?<=This is)(.*)(?=sentence)
Usei o lookbehind (?<=)
e o antecipei (?=)
para que "This is" e "sentença" não sejam incluídos na correspondência, mas isso depende do seu caso de uso, você também pode simplesmente escrever This is(.*)sentence
.
O importante aqui é que você ative o modo "dotall" do seu mecanismo de expressão regular, para que ele .
corresponda à nova linha. Mas como você faz isso depende do seu mecanismo de expressão regular.
A próxima coisa é se você usar .*
ou .*?
. O primeiro é ganancioso e corresponderá até a última "sentença" em sua string, o segundo será preguiçoso e corresponderá até a próxima "sentença" em sua string.
Atualizar
This is(?s)(.*)sentence
Onde o (? S) ativa o modificador dotall, fazendo a .
correspondência dos caracteres da nova linha.
Atualização 2:
(?<=is \()(.*?)(?=\s*\))
está correspondendo ao seu exemplo "Esta é uma sentença (simples)". Veja aqui no Regexr
This is(?s)(.*)sentence
estaria funcionando?
Ressuscitar esta pergunta porque a expressão regular na resposta aceita não me parece correta. Por quê? Porque
(?<=This is)(.*)(?=sentence)
vai combinar my first sentence. This is my second
emThis is my first sentence. This is my second sentence.
Você precisa de um quantificador lento entre as duas visões. A adição de a ?
torna a estrela preguiçosa.
Isso corresponde ao que você deseja:
(?<=This is).*?(?=sentence)
Veja a demonstração . Eu removi o grupo de captura, o que não era necessário.
Modo DOTALL para coincidir com quebras de linha
Observe que, na demonstração, o "ponto corresponde ao modo de quebras de linha" (aka) dot-all está definido (veja como ativar o DOTALL em vários idiomas ). Em muitos tipos de expressões regulares, você pode configurá-lo com o modificador online (?s)
, transformando a expressão em:
(?s)(?<=This is).*?(?=sentence)
Referência
.*
e .*?
também é explicada na minha resposta (o parágrafo antes de "Atualizar"). Portanto, não acho que minha resposta esteja incorreta.
is incorrect
para doesn't seem quite correct to me
... Espero que isso não faça você se mexer, provavelmente apenas uma diferença de percepção sobre qual deve ser a expressão regular para uma resposta de tráfego intenso.
Tente This is[\s\S]*sentence
, funciona em javascript
[\s\S]*?
(também chamado: wildcard não-ganancioso)
Este:
This is (.*?) sentence
funciona em javascript.
usa isto: (?<=beginningstringname)(.*\n?)(?=endstringname)
endstringname
Caso alguém esteja procurando um exemplo disso dentro de um contexto Jenkins. Ele analisa o build.log e, se encontrar uma correspondência, falha na compilação com a correspondência.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
node{
stage("parse"){
def file = readFile 'build.log'
def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
Matcher match = regex.matcher(file)
match.find() {
capturedText = match.group(1)
error(capturedText)
}
}
}
Você pode simplesmente usar isso: \This is .*? \sentence
Isso funcionou para mim (estou usando o código VS ):
para:
This is just\na simple sentence
Usar:
This .+ sentence
No texto sublime, você simplesmente escreve as duas palavras que deseja manter, por exemplo, no seu caso, é
"Isto é" e "sentença"
e você escreve. * entre
ie This is .* sentence
e isso deve te fazer bem
Aqui está como eu fiz:
Isso foi mais fácil para mim do que tentar descobrir o regex específico necessário.
int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); `
Eu cheguei aqui na minha pesquisa por regex para converter essa sintaxe de impressão entre "string" de impressão, em Python2 em scripts antigos com: print ("string"), para Python3. Funciona bem; caso contrário, use 2to3.py para conversões adicionais. Aqui está a minha solução para os outros:
Experimente no Regexr.com (por algum motivo não funciona no NP ++):
find: (?<=print)( ')(.*)(')
replace: ('$2')
para variáveis:
(?<=print)( )(.*)(\n)
('$2')\n
para rótulo e variável:
(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n
Como substituir toda a "string" de impressão no Python2 pela print ("string") do Python3?
RegEx para combinar tudo entre duas cadeias usando a abordagem Java.
List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";
Vamos usar objetos Pattern e Matcher para usar RegEx (. ?) * .
Pattern p = Pattern.compile("Code "(.*?)" world"); //java.util.regex.Pattern;
Matcher m = p.matcher(example); //java.util.regex.Matcher;
Como o Matcher pode conter mais de uma correspondência, precisamos repetir os resultados e armazená-los.
while(m.find()){ //Loop through all matches
results.add(m.group()); //Get value and store in collection.
}
Este exemplo conterá apenas "salvará a" palavra, mas no texto maior provavelmente encontrará mais correspondências.