【问题标题】:modify regex to allow floating point number修改正则表达式以允许浮点数
【发布时间】:2011-12-26 03:04:29
【问题描述】:

在我的代码中,除了其他模式之外,还有一个用于识别整数的模式

Pattern patternNumber = Pattern.compile("[0-9]+");

要读取输入,我一直在使用*:

 String input = "x: 1.6 ..10;";
 String[] meta = a.split("(?:(?<=^|\\s)(?=\\S)|(?<=\\S|^)(?=\\s))\\b(?:(?<=\\S)(?=\\s|$)|(?<=\\s)(?=\\S|$))|\\b");

*感谢我找到的 here,稍作修改以适应。我对正则表达式没有太多经验,但这条线对我来说很神奇。

然后我继续添加浮点数:

Pattern patternNumber = Pattern.compile("\\d*\\.\\d+|\\d+");

但现在我似乎无法让它工作。对于浮点数部分,它拆分数字,给我:

1  
.  
6

而我想要的是:

1.6

我发现如果我单独使用它会起作用:

 String input = "1.6";
 String[] meta = a.split("\\D\\.\\D");

知道如何让这部分与 split 方法中的其余表达式一起工作吗?

【问题讨论】:

  • 只是澄清一下,在您的原始字符串x: 1.6 ..10; 中,您想退出1.610 吗?
  • @mathematical.coffee 不,我没有。对于第一部分,我很乐意让它拆分我的输入,给我一个“数字、一个点和另一个数字”。但现在我希望它能够识别整个浮点数。

标签: java regex


【解决方案1】:

我认为split 不是最适合您的工具。

split 将在您的正则表达式中拆分您的输入字符串。例如,如果您使用正则表达式 ,1,2,3,apples 执行 split,您将得到 12, 3apples

您复杂的split 正则表达式"(?:(?&lt;=^|\\s)(?=\\S)|(?&lt;=\\S|^)(?=\\s))\\b*(?:(?&lt;=\\S)(?=\\s|$)|(?&lt;=\\s)(?=\\S|$))|\\b" 基本上试图在单词之间的边界上拆分字符串(考虑到单词位于字符串的开头/结尾,或者以. 开头(@ 987654333@))。

相反,明确地查找数字本身会容易得多!而不是在数字之间的空格上拆分,只需显式匹配数字。

因此,您将正则表达式用于数字/浮点数 \\d*\\.\\d+|\\d+,并使用 myMatcher.group() 打印出匹配项(而不是拆分)。

例如:

String input = "x: 1.6 ..10;";
myPattern = Pattern.compile('\\d*\\.\\d+|\\d+');
myMatcher = Pattern.matcher(input);
while (myMatcher.find()) {
    System.out.println(myMatcher.group());
    // will print 1.6, .10
}

根据您想要的内容(例如关于..10),可以调整正则表达式。

【讨论】:

  • 这击中了我的浮点数问题。但是,我应该提到我使用的是字符串数组,因为我关心标记在输入字符串上出现的确切顺序,因此我决定使用“拆分”。我不及早澄清是不好的,尽管你的回答可能正是我的另一个项目所需要的。
【解决方案2】:

您可以拆分浮点数范围之外的任何字符系列。

String input="x: 1.6 ..10";
String[] meta=input.split("[^0-9.-]+");

对于上述情况,meta 将被分配 { "1.6" , "..10" }

String[] example="123, -.456, 78.910 : 11 : -12".split("[^0-9.-]+")

这将产生 { "123", "-.456", "78.910", "11", "-12" }

【讨论】:

  • 抱歉这么久才回复。虽然您的回答很有意义,但我无法将其添加到我的原始表达中。无论我如何尝试安排它,我最终都不得不放一个“\\b”,这会破坏我的浮点数。关于我如何将您的答案与我的表达结合在一起的任何线索?
  • 当然。指定您的表达式、将其应用于的测试用例以及您想要的结果。你可能真的很亲密。
  • 表达式,测试用例和结果是我在初始帖子中发布的。尽管看起来很奇怪和愚蠢,但实际上我在将您的 [^0-9.-]+ 添加到开头问题中描述的表达式中时遇到了麻烦。例如,x: 1.6 ..10; 应该给我一个拆分字符串,其中包含:x:1.6、`, .., 10, and ;. It works for everything except the 1.6, which it continues to break into 1@933 @.` 和6 如果将您的答案添加到那个更大的表达式。希望这是有道理的。
  • 我明白了。您不仅要尝试提取浮点数,还希望将它们的上下文保留在原始字符串中,甚至可能同时对其他单词和符号进行一些解析。
  • 鉴于您的请求的复杂性,我认为您应该考虑“自己动手”。您可以 .toCharArray() 您的 String 并逐个字符地遍历它,确定何时到达单词边界并将该单词附加到 ArrayList 中,丢弃任何被解释为分隔符的内容。您尝试做的事情看起来并不奇怪或愚蠢......它恰好比从字符串中挑选数字更复杂。
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多