Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 为什么我的字符串数组长度是3而不是2?_Java_Regex - Fatal编程技术网

Java 为什么我的字符串数组长度是3而不是2?

Java 为什么我的字符串数组长度是3而不是2?,java,regex,Java,Regex,我在试着理解正则表达式。我想使用split生成一个字符串[],以显示给定字符串表达式中有多少个字母 import java.util.*; import java.io.*; public class Main { public static String simpleSymbols(String str) { String result = ""; String[] alpha = str.split("[\\+\\w\\+]"); int alpha

我在试着理解正则表达式。我想使用split生成一个字符串[],以显示给定字符串表达式中有多少个字母

import java.util.*; 
import java.io.*;

public class Main {

  public static String simpleSymbols(String str) {

     String result = "";
     String[] alpha = str.split("[\\+\\w\\+]");
     int alphaLength = alpha.length;
     // System.out.print(alphaLength);

     String[] charCount = str.split("[a-z]");
     int charCountLength = charCount.length;
     System.out.println(charCountLength);
   }
}

我的输入字符串是
“+d+=3=+s+”
。我拆分字符串以计算字符串中的字母数。数组长度应该是2,但我得到了3。另外,我正在尝试制作一个正则表达式来检查模式+b+,其中b是字母表中的任何字母?对吗?

因此,我突然想到了几件事:

首先,您的正则表达式看起来是正确的。如果你曾经担心你的正则表达式将如何运行,你可以用它来检查一下。只需将正则表达式放在顶部,然后在底部输入字符串,看看是否匹配正确

第二,仔细检查后,我发现您正在使用split函数。虽然快速拆分字符串很方便,但您需要小心拆分的内容。在本例中,您将删除最初查看的所有字符串,这将使查找变得不可能。如果打印出来,您会注意到以下显示(对于+d+=3=+s+的输入字符串):

这表明你不小心把你想找的东西剪掉了。现在,有几种方法可以解决这个问题,具体取决于您的标准

现在,如果你想要的只是在所有+s上分开,并且只找到由+s直接限定的内容并不重要,那么split就非常有效。只需执行str.split(“+”),这将返回以下列表(对于+d+=3=+s+):

但是,您可以看到这带来了一些问题。首先,它没有去掉我们不想要的=3=,其次,它没有真正为我们提供由++格式包围的值,其中下划线表示您要查找的字符串/字符

当您使用+w时,您打算查找被+s包围的单词。然而,如果你只是想找到一个角色,我建议使用另一个,比如[a-z]或[a-zA-z]来更具体一些。但是,如果您想查找多个字母字符,您的模式就可以了。您还可以在模式的末尾添加*(0或更多)或+(1或更多),以明确说明您要查找的内容

我不会直接给你答案,但我会给你一个前进方向的线索。尝试使用模式和匹配器查找上面列出的正则表达式,如果找到匹配项,请确保将其存储在某个位置:)

另外,为了便于将来参考,您应该始终以小写字母开头函数名,至少在Java中是这样。只有常量和类名应以大写开头:)

我正在尝试使用split来计算该字符串中的字母数。数组长度应该是2,但我得到了3

拆分函数中的正则表达式用作分隔符,不会显示在结果中。在您的例子中,“str.split([a-z])意味着使用字母表作为分隔符来分隔输入字符串,这将构成三个子字符串“(+)| d |”(+=3=+)| s |(+)”

如果确实要使用“拆分”来计算字母数,请使用“str.split”([^a-z]”)。但我建议使用“java.util.regex.Matcher.find()”来查找所有字母

另外,我正在尝试制作一个正则表达式来检查模式+b+,其中b是字母表中的任何字母?对吗


类似地,检查“java.util.regex.Matcher”中的函数。

\w
[a-zA-Z0-9]
中的函数匹配。您可以使用[a-zA-Z]仅匹配字母。你能包括你正在执行拆分的字符串吗?不知道为什么你认为它是两个。您只需使用
[+\\w]
+
在大括号
[]
中不被视为java中的特殊正则表达式字符。此外,不考虑其在大括号中的位置,只应匹配一个字符,因此放置2
+
是非常重要的。@AndyTurner您是对的,已修复。请注意,您显示的代码甚至没有编译。该方法至少缺少大括号
{…}
。如果你能和我一起分享,那就太好了。
+
+=3=+
+
d
=3=
s