【问题标题】:Creating regular expression for splitting创建用于拆分的正则表达式
【发布时间】:2015-02-19 17:55:52
【问题描述】:

我目前正在学习信息学并且知道正则表达式是什么(不是在 java 中)。 我有这样的输入:

"String1  ( Nr = 323) String2 String3 (Nr  = 3)"

我想通过以下方式拆分它:

split("[ ()=]");

因为我认为这会拆分所有“”,“(”,)”,“=”。我对吗?还是我需要在它后面加一个 + ?如果这已经是正确的,我可以添加一个 * 所以我也可以拆分为“((”?

如果这不是问题,那么我关于 java 中正则表达式的另一个问题是如何检查我的字符串是否只包含数字。

我试过了:

contains(".*\\d+.*")
matches(".*\\d+.*")

但我很确定其中一个正在工作。所以我的问题应该是拆分正则表达式。

我最初的问题是,我在索引 2 处的拆分字符串数组得到了 NumberFormatException,通常应该是“323”?

我可以将我的正则表达式与* 一起使用吗?喜欢"[ ()=]*"

提前致谢

【问题讨论】:

  • 您期望的输出是什么?并检查一个字符串是否只有数字。 str.matches("\\d+")
  • 如果您想将323 作为索引2,您需要拆分一个或多个字符:split("[ ()=]+")
  • 如果你打算从字符串中提取数字而不关心其他数据,你可以检查java.util.regex.PatternMatcher类。还有这个question/answer
  • 不是真的试图提取它我只是想知道数字是在索引 2 还是 4 (如 hwnd 赞成的答案中所述),所以我可以使用 splitString[2 创建我的对象] 或 splitString[4] 作为数字。不知道你是不是这个意思。

标签: java regex split


【解决方案1】:

是的,它会根据这些字符进行拆分,但不会产生预期的结果。您需要在字符类中使用量词。我建议使用+ 表示“一次或多次”。

String s = "String1  ( Nr = 323) String2 String3 (Nr  = 3)";
String[] parts = s.split("[ ()=]+");
System.out.println(Arrays.toString(parts));

输出

[String1, Nr, 323, String2, String3, Nr, 3]

【讨论】:

  • 感谢现在大部分代码都在工作。但是字符串有可能看起来像:“String1(Nr = 323)String2 String3”或“String1 String2 String3(Nr = 323)”(以323为例)我想首先检查splitlength是否为5并且那么 splitstring[2] 或 from [4] 是否是一个数字,但使用 ("\\d+") 不起作用。有什么想法吗?
  • 哦,我想我忘了告诉你们(要编辑它)我不能为“-”拆分。 \\s 将拆分为所有空格(,。|()/ ....)?编辑:你说的修剪是什么意思? (不是母语人士)修剪就像剪掉它?但我不明白你修剪字符串是什么意思
【解决方案2】:

用于分割字符串的正则表达式

  • 必须描述你想要的字符串之间的所有分隔符
  • 可能无法描述空字符串

你有非空格分隔符()= 被你想要的字符串之间的空格包围。你可以慷慨并使用

"[ ()=]+"   any mixture

或繁琐(需要()= 之一)然后做

"\\s*[()=]\\s*"

使用此正则表达式,"foo (( bar" 的拆分将为您提供三个字符串。

确保它只是()= 三重奏中的*一个。

要检查字符串是否只包含数字,您必须定义“数字”。 “数字”和“数字”之间存在普遍的混淆,“数字”可能是有符号的或无符号的、整数或分数,... Numbers 表示至少有一个空格。

"\\s*(\\d+)(\\s+\\d+)*\\s*"

描述由(可选)空格分隔和包围的无符号整数。在这个简单的例子中,也

"[\\s\\d]+"

会的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2020-02-07
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2013-08-11
    相关资源
    最近更新 更多