O seguinte deve ser correspondido:
AAA123
ABCDEFGH123
XXXX123
posso fazer ".*123"
:?
O seguinte deve ser correspondido:
AAA123
ABCDEFGH123
XXXX123
posso fazer ".*123"
:?
Respostas:
Sim você pode. Isso deve funcionar.
.
= qualquer caractere\.
= o caractere de ponto real.?
= .{0,1}
= corresponde a qualquer caractere zero ou uma vez.*
= .{0,}
= corresponde a qualquer caractere zero ou mais vezes.+
= .{1,}
= corresponde a qualquer caractere uma ou mais vezesSim, isso funcionará, embora observe que .
não corresponderá às novas linhas, a menos que você passe o sinalizador DOTALL ao compilar a expressão:
Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
.
que corresponderia a novas linhas. Estou feliz por ler sua resposta, preciso usá-la!
{.,\n,\r,\u2028,\u2029,\u0085}
para corresponder absolutamente a qualquer caractere (os caracteres Unicode são caracteres de terminação de linha adicionais, adicionados não correspondidos pelo .
Java), mas {.,\n,\r}
funcionariam para a maioria dos arquivos de texto.
[\s\S]
é uma maneira popular de combinar qualquer caractere se você não puder usar DOTALL.
(?:.|\\v)*
, por causa do JDK-6337993 .
Existem muitas ferramentas sofisticadas de teste e desenvolvimento de expressões regulares, mas se você quer apenas um equipamento de teste simples em Java, aqui está uma para você brincar:
String[] tests = {
"AAA123",
"ABCDEFGH123",
"XXXX123",
"XYZ123ABC",
"123123",
"X123",
"123",
};
for (String test : tests) {
System.out.println(test + " " +test.matches(".+123"));
}
Agora você pode adicionar facilmente novos casos de teste e experimentar novos padrões. Divirta-se explorando regex.
Não, *
corresponderá a zero ou mais caracteres. Você deveria usar+
, o que corresponde a um ou mais.
Esta expressão pode funcionar melhor para você: [A-Z]+123
A maneira mais comum que eu vi para codificar isso é com uma classe de caracteres cujos membros formam uma partição do conjunto de todos os caracteres possíveis.
Normalmente as pessoas escrevem isso como [\s\S]
(espaços em branco ou não-espaço em branco), embora [\w\W]
, [\d\D]
etc. faria todo o trabalho.
.*
e.+
são para quaisquer caracteres, exceto para novas linhas.
Caso deseje incluir novas linhas, as seguintes expressões também podem funcionar para as linguagens em que é necessário escape duplo, como Java ou C ++:
[\\s\\S]*
[\\d\\D]*
[\\w\\W]*
por zero ou mais vezes, ou
[\\s\\S]+
[\\d\\D]+
[\\w\\W]+
por uma ou mais vezes.
O escape duplo não é necessário para algumas linguagens como C #, PHP, Ruby, PERL, Python, JavaScript:
[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularExpression{
public static void main(String[] args){
final String regex_1 = "[\\s\\S]*";
final String regex_2 = "[\\d\\D]*";
final String regex_3 = "[\\w\\W]*";
final String string = "AAA123\n\t"
+ "ABCDEFGH123\n\t"
+ "XXXX123\n\t";
final Pattern pattern_1 = Pattern.compile(regex_1);
final Pattern pattern_2 = Pattern.compile(regex_2);
final Pattern pattern_3 = Pattern.compile(regex_3);
final Matcher matcher_1 = pattern_1.matcher(string);
final Matcher matcher_2 = pattern_2.matcher(string);
final Matcher matcher_3 = pattern_3.matcher(string);
if (matcher_1.find()) {
System.out.println("Full Match for Expression 1: " + matcher_1.group(0));
}
if (matcher_2.find()) {
System.out.println("Full Match for Expression 2: " + matcher_2.group(0));
}
if (matcher_3.find()) {
System.out.println("Full Match for Expression 3: " + matcher_3.group(0));
}
}
}
Full Match for Expression 1: AAA123
ABCDEFGH123
XXXX123
Full Match for Expression 2: AAA123
ABCDEFGH123
XXXX123
Full Match for Expression 3: AAA123
ABCDEFGH123
XXXX123
Se você deseja explorar a expressão, ela foi explicada no painel superior direito de regex101.com . Se desejar, também é possível assistir neste link , como ele corresponderia a algumas entradas de amostra.
O jex.im visualiza expressões regulares:
(\W|\w)*
vez de dupla fuga
Solução específica para o problema de exemplo: -
Tente [A-Z]*123$
irá corresponder a 123
, AAA123
, ASDFRRF123
. Caso você precise de pelo menos um personagem antes de 123
usar [A-Z]+123$
.
Solução geral para a pergunta (como combinar "qualquer caractere" na expressão regular):
[\w|\W]{min_char_to_match,}
.[\S]{min_char_to_match,}
.[^]
deve corresponder a qualquer caractere, incluindo nova linha. [^
CHARS]
corresponde a todos os caracteres, exceto aqueles em CHARS . Se CHARS estiver vazio, ele corresponderá a todos os caracteres.
Exemplo de JavaScript:
/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.
Experimente o regex .{3,}
. Isso corresponderá a todos os caracteres, exceto uma nova linha.
Eu trabalho isso Nem sempre o ponto é significa qualquer caractere. Exceção quando o modo de linha única. \p{all}
deveria estar
String value = "|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";
String expression = "[a-zA-Z0-9\\p{all}]{0,50}";
if(value.matches(expression)){
System.out.println("true");
} else {
System.out.println("false");
}