Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 以点作为分隔符拆分字符串_Java_Regex_String_Split - Fatal编程技术网

Java 以点作为分隔符拆分字符串

Java 以点作为分隔符拆分字符串,java,regex,string,split,Java,Regex,String,Split,我想知道我是否打算以正确的方式在上拆分字符串?我的代码是: String[] fn = filename.split("."); return fn[0]; 我只需要字符串的第一部分,这就是我返回第一项的原因。我问这个问题是因为我在API中注意到表示任何字符,所以现在我被卡住了。拆分必须以regex作为参数。。。只需更改”. >代码> \“ > /p> 代码>()/代码>接受正则表达式,因此您需要逃出 .,不要认为它是正则表达式元字符。下面是一个例子: String[] fn = filena

我想知道我是否打算以正确的方式在
上拆分字符串?我的代码是:

String[] fn = filename.split(".");
return fn[0];

我只需要字符串的第一部分,这就是我返回第一项的原因。我问这个问题是因为我在API中注意到
表示任何字符,所以现在我被卡住了。

拆分必须以regex作为参数。。。只需更改<代码>”.<代码> >代码> \“<代码/> > /p> <代码>代码>()/代码>接受正则表达式,因此您需要逃出<代码> .<代码>,不要认为它是正则表达式元字符。下面是一个例子:

String[] fn = filename.split("\\."); 
return fn[0];

split
将正则表达式作为参数。因此,您应该传递
“\。”
而不是
,因为
是正则表达式中的元字符。

字符串分割(String)方法使用正则表达式。 在正则表达式中,“.”字符表示“任何字符”。 可以通过转义“”来避免此行为

或者告诉split方法在字符类上拆分:

filename.split("[.]");
字符类是字符的集合。你可以写

filename.split("[-.;ld7]");

文件名将在每一个“-”,“”,“;”,“l”,“d”或“7”处拆分。在字符类中,“.”不是特殊字符(“元字符”)。

使用它不是更有效吗

 filename.substring(0, filename.indexOf("."))

如果您只想知道第一个点的内容?

Split使用正则表达式,其中“.”是一个表示任何内容的特殊字符。如果确实希望它与“.”字符匹配,则需要对其进行转义:

String[] fn = filename.split("\\.");
(一个“\”用于转义正则表达式中的“.”,另一个用于转义Java字符串中的第一个)

我也不建议返回fn[0],因为如果您有一个名为
something.blabla.txt
的文件,这是一个有效的名称,那么您将不会返回实际的文件名。相反,我认为最好使用:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
由于点(.)被视为一个特殊字符,String的split方法需要一个正则表达式,您需要这样做-

String[] fn = filename.split("\\.");
return fn[0];

在java中,特殊字符需要用“\”转义,但由于“\”在java中也是一个特殊字符,因此需要用另一个“\”再次转义

通常用手揭开面具不是个好主意。此任务的模式类中有一个方法:

java.util.regex
static String quote(String s) 
我在这里只看到解决方案,但没有对问题的完整解释,所以我决定发布这个答案

问题 关于
text.split(delim)
,您需要了解一些事情<代码>拆分方法:

  • 接受为参数正则表达式(regex),它描述了要拆分的分隔符
  • 如果
    delim
    存在于
    文本的末尾,比如
    a,b,c,
    (其中分隔符是
    split
    首先将创建类似
    [“a”“b”“c”“”]
    的数组,但由于在大多数情况下我们并不真正需要这些尾随的空字符串,所以它也会自动为我们删除它们。因此,它创建另一个没有这些尾随空字符串的数组并返回它
  • 你还需要知道它在正则表达式中。它表示任何字符(线分隔符除外,但可以使用
    Pattern.DOTALL
    标志进行更改)

    所以对于像
    “abc”
    这样的字符串,如果我们在
    上拆分“
    拆分方法将

  • 创建类似于
    [“”]
    的数组
  • 但由于该数组只包含空字符串,并且它们都是尾随字符串,因此将删除它们(如前第二点所示)
  • 这意味着我们将得到空数组
    []
    (没有元素,甚至没有空字符串),因此我们不能使用
    fn[0]
    ,因为没有索引0

    解决方案 要解决这个问题,只需创建表示点的正则表达式。为此,我们需要避开
    。有几种方法可以做到这一点,但最简单的方法可能是使用
    \
    (在字符串中需要写成
    “\\”
    ,因为
    \
    在那里也很特殊,需要另一个
    \
    进行转义)

    因此,您的问题的解决方案可能如下所示

    String[] fn = filename.split("\\.");
    
    奖金

    你也可以用其他的方法来逃避这个点

    • 使用字符类
      拆分(“[.]”)
    • 将其包装在引号
      split(\\Q.\\E”)
    • 使用带有
      Pattern.LITERAL
      标志的适当模式实例
    • 或者简单地使用
      split(Pattern.quote(“.”)
      并让regex为您进行转义

    注意:即使在点转义之后,也应进一步注意此代码段

    如果filename只是字符串“”,那么fn的长度仍然是0,fn[0]仍然会抛出异常


    这是因为,如果模式至少匹配一次,那么split将从数组中丢弃所有尾随的空字符串(也就是点之前的字符串!),留下一个空数组返回。

    对我有效的解决方案如下

    String str="1.2.3";
    String[] cats = str.split(Pattern.quote("."));
    
    filename.split(“[.]”)


    使用ApacheComons
    最简单:

    File file = ...
    FilenameUtils.getBaseName(file.getName());
    

    注意,它还从完整路径中提取一个文件名。

    问题是标记为Java,而不是Javascript,这是您链接到的。@MisterSmith先生,您可能想看看这里的编程语言。我们说的是java,不是javascript。你说得绝对正确。昨天我很累,因为正在用两种语言编写代码,所以没有注意到Java数据类型。在2010年,我认为答案可能是正确的,但今天的浏览器却以不同的方式运行。在像现在这样的情况下,最简单的解决方案是向split调用传递一个限制参数2:String[]fn=filename.split(“[.]”,2);这我真的很喜欢:
    split(“[.]”)
    File file = ...
    FilenameUtils.getBaseName(file.getName());