Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么零长度字符始终保留在java正则表达式模式a的源字符串末尾?_Java_Regex - Fatal编程技术网

为什么零长度字符始终保留在java正则表达式模式a的源字符串末尾?

为什么零长度字符始终保留在java正则表达式模式a的源字符串末尾?,java,regex,Java,Regex,输出: Pattern pattern = Pattern.compile("a?"); Matcher matcher = pattern.matcher("a"); while(matcher.find()){ System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end()); } 为什么这给了我两个输出,而只有一个字符作为匹配器 我注意到对于这个模式,它总是在源字符串的末尾给出一个零长度。 当来源是a

输出:

Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("a");
while(matcher.find()){
   System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}
为什么这给了我两个输出,而只有一个字符作为匹配器

我注意到对于这个模式,它总是在源字符串的末尾给出一个零长度。 当来源是abab时,它给出

0[a]1
1[]1

正则表达式的特殊字符?问号表示零或一次匹配前面的事物

由于在while循环中匹配while matcher.find{…它会查找表达式的两个匹配项—在位置0处出现一个字符串a,在位置1处出现零个字符串a,在最末端出现空字符串

下面是您的代码段匹配的内容,开始/结束索引由X/Y表示:


在位置0/0或2/2中不匹配,因为表达式是贪婪的,这意味着它将尝试在位置0/1、2/3的位置上考虑下一个字符,只要它不使匹配无效,那么它就不会被跳过。为了说明,如果你要匹配字符串BBBB和模式A,那么你会得到五个空字符串,每个空字符串的开头、结尾和每个字符之间各有一个字符。

正则表达式特殊字符?问号表示零次或一次匹配前面的内容

由于在while循环中匹配while matcher.find{…它会查找表达式的两个匹配项—在位置0处出现一个字符串a,在位置1处出现零个字符串a,在最末端出现空字符串

下面是您的代码段匹配的内容,开始/结束索引由X/Y表示:

在位置0/0或2/2中不匹配,因为表达式是贪婪的,这意味着它将尝试在位置0/1、2/3的位置上考虑下一个字符,只要它不使匹配无效,那么它就不会被跳过。为了说明,如果你要匹配字符串BBBB和模式A,那么你会得到五个空字符串,在每个字符的开头、结尾和中间,每个空字符串各有一个。

a?表示字符a的0或1出现

空字符串与0匹配

在您的情况下,匹配也是贪婪的,因此它首先匹配1发生率,然后匹配最后的0发生率

在abab的情况下,将其视为a[]ba[]b[],其中[]表示找到的空发生率。匹配器在第一个b的开头或后面找不到它,因为它可以在a上贪婪地匹配。

a?表示字符a的0或1发生率

空字符串与0匹配

在您的情况下,匹配也是贪婪的,因此它首先匹配1发生率,然后匹配最后的0发生率

在abab的情况下,将其视为a[]ba[]b[],其中[]表示找到的空发生率。匹配器在第一个b的开头或后面找不到它,因为它可以在a上贪婪地匹配。

请查看

它在“零长度匹配”一节中详细解释了您的案例


它在“零长度匹配”一节中详细解释了您的情况,匹配最后一个字符后的空格不是通用的

Vim编辑器具有以下行为:

前缓冲区:

String: " a b a b "
         ├─┼─┼─┼─┤
Index:   0 1 2 3 4
Match:   ╰┬╯ ╰┬╯ ╰- the empty string 4/4 (zero occurrences of "a").
          ||  |╰- the empty string 3/3 (zero occurrences of "a").
          ||  ╰ the string "a" 2/3 (one occurrence of "a").
          |╰ the empty string 1/1 (zero occurrences of "a").
          ╰ the string "a" 0/1 (one occurrence of "a").
aaaa中不出现x,但Vim中默认情况下写入的x允许空匹配。模式匹配字符串开头和之间的空白 所有字符,但不能超过结尾

如果该行为空,则为例外。该命令将用单个y替换空行

我在自己的程序中实现了类似Vim的行为:

yayaya
~
~
这是因为Vim很流行,如果出现任何问题,我可以将其作为参考模型。但这有点像黑客。逻辑有一个do..while循环,允许处理传入的空字符串:

$ txr -c '@(bind result @(regsub #/x?/ "y" "aaaa"))'
result="yayayaya"

$ txr -c '@(bind result @(regsub #/x?/ "y" ""))'
result="y"
因此,如果起始位置为零,输入的长度为零,则循环一次,将正则表达式应用于空字符串。但如果处理最后一个字符,位置达到长度,循环终止,而不处理空字符串

最初,我在顶部有一个循环测试,因此它的行为类似于Vim,但不是在空输入情况下,它不会匹配在空输入上匹配的正则表达式

您正在使用的Java类的行为可能实现如下:

do {
  /* regex match, extraction, substitution ... */
  position++;
} while (position < length(input))

匹配最后一个字符后的空格不是通用的

Vim编辑器具有以下行为:

前缓冲区:

String: " a b a b "
         ├─┼─┼─┼─┤
Index:   0 1 2 3 4
Match:   ╰┬╯ ╰┬╯ ╰- the empty string 4/4 (zero occurrences of "a").
          ||  |╰- the empty string 3/3 (zero occurrences of "a").
          ||  ╰ the string "a" 2/3 (one occurrence of "a").
          |╰ the empty string 1/1 (zero occurrences of "a").
          ╰ the string "a" 0/1 (one occurrence of "a").
aaaa中不出现x,但Vim中默认情况下写入的x允许空匹配。模式匹配字符串开头和之间的空白 所有字符,但不能超过结尾

如果该行为空,则为例外。该命令将用单个y替换空行

我在自己的程序中实现了类似Vim的行为:

yayaya
~
~
只是因为Vim很流行,如果有任何问题,我可以将其作为参考模型 一个黑客。这一逻辑是有道理的。。while循环,允许处理传入的空字符串:

$ txr -c '@(bind result @(regsub #/x?/ "y" "aaaa"))'
result="yayayaya"

$ txr -c '@(bind result @(regsub #/x?/ "y" ""))'
result="y"
因此,如果起始位置为零,并且输入的长度为零,我们将循环一次,将正则表达式应用于空字符串。但如果我们处理最后一个字符,位置达到长度,循环终止而不处理空字符串

最初,我在顶部有一个循环测试,因此它的行为类似于Vim,但不是在空输入情况下,它不会匹配在空输入上匹配的正则表达式

您正在使用的Java类的行为可能实现如下:

do {
  /* regex match, extraction, substitution ... */
  position++;
} while (position < length(input))

A.标记a为可选的,AFAICT。是的,我有那个搅拌机。但是在字符串结束后,为什么还有另一个零长度的?a?标记a为可选的,AFAICT。是的,我有那个搅拌机。但是在字符串结束后,为什么还有另一个零长度的?是的。但是,当它已经遇到一个匹配的字符串时,它如何以及为什么会遇到零出现呢?请将其视为一个空字符串,它总是位于字符串中每个字符的末尾加上字符串的开头。但是,当它已经遇到一个匹配的字符串时,它如何以及为什么会遇到零出现呢?请将其视为一个空字符串,它总是位于字符串中每个字符的末尾加上stringThanx的开头+1作为参考。它表示零长度匹配可以在几种情况下发生:在空输入字符串中,在输入字符串的开头,在输入字符串的最后一个字符之后,或者在输入字符串的任意两个字符之间。但是为什么它没有遇到起始零长度的一呢?我的意思是你能解释一下每一个都会遇到什么情况吗?它将不匹配字符串[0]处的零长度子字符串,因为你的字符串以a开头。a是正则表达式a的最长可能匹配项?;因此,正则表达式的范围从0到1。试一试?针对一个不以a开头的字符串。啊哈!现在我得到了起始零长度1。坦克斯卡兹+1.感谢你提到了试一试?针对不以.Thanx开头的字符串+1作为参考。它表示零长度匹配可以在几种情况下发生:在空输入字符串中,在输入字符串的开头,在输入字符串的最后一个字符之后,或者在输入字符串的任意两个字符之间。但是为什么它没有遇到起始零长度的一呢?我的意思是你能解释一下每一个都会遇到什么情况吗?它将不匹配字符串[0]处的零长度子字符串,因为你的字符串以a开头。a是正则表达式a的最长可能匹配项?;因此,正则表达式的范围从0到1。试一试?针对一个不以a开头的字符串。啊哈!现在我得到了起始零长度1。坦克斯卡兹+1.感谢你提到了试一试?针对一个不以.wow开头的字符串。多么努力啊,迈尔斯+谢谢你的解释。我现在明白你的意思了。太多了,哇。多么努力啊,迈尔斯+谢谢你的解释。我现在明白你的意思了。很多。