Modo ganancioso:
O indicador de quantidade padrão é o modo de ganância, a menos que indicado de outra forma. As expressões de padrões gananciosos continuarão a corresponder até que não possam. Se você achar que o resultado da correspondência de expressão não corresponde ao esperado, é muito provável que seja porque - você acha que a expressão corresponderá apenas aos primeiros caracteres, mas na verdade é um padrão ganancioso, portanto continuará a corresponder.
Ganância e não cinza, mais? não é escreva:
var s = '1023000'.Match (/(/d+) (0*)/); s ["1023000", "1023000", ""] var s =' 1023000'.Match (/^(/d+) (0*) $/); S ["1023000", 1023000 "," '1023000'.Match (/^(/d+?) (0*) $/); s ["10", "1", "0"]
As expressões regulares do Java usam o padrão de correspondência ganancioso ganancioso por padrão. É a correspondência mais longa deste tipo (.*). Se a correspondência mais curta for necessária, será alterada para (.*?) Ou seja, é um padrão de correspondência mal.
Análise de princípios:
Se for um padrão de correspondência ganancioso, o motor de expressão regular corresponderá até o final da string. Quando a correspondência for falsa, ele vai para trás e encontrará a última posição correspondente para retornar o resultado correspondente. Se for um padrão de correspondência quase, o motor de expressão regular corresponderá ao caractere no final do padrão e depois dará um passo atrás, descobrirá que a partida é falsa e, em seguida, rastreie a posição em que a correspondência mais recente encontrada no fallback é verdadeira, retornando o resultado.
Veja o código:
Exemplo 1:
public void test51 () {string str = "aaa/" bbb/"ccc/" dd/"eee"; System.out.println (str); str = str.replaceall ("/"(.*)/" ","@"); System.out.println (str); } Saída:
aaa "bb" cc "ddd" eeeaaa@eeee
Exemplo 2:
@Test public void test52 () {string str = "aaa/" bbb/"ccc/" dd/"eee"; System.out.println (str); str = str.Replaceall ("/"(.*?)/" ","@"); System.out.println (str); } Saída:
aaa "bb" cc "ddd" eeeaaa@ccc@eeee