java—用于后跟单词的浮点数和非浮点数的正则表达式

roqulrg3  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(347)

我的任务是解决一个问题,即某个特定的表列中总是包含相同类型的数据。出于验证目的,我认为基于模式匹配来验证数据是最容易的。
数据集示例:


* 12 days ago
* 1 minutes ago
* 5.8 hours ago
* 3.2 years ago

(忽略*)这是我想出的正则表达式,但我觉得有点不对劲:

String f = "^(?:\\d+|\\d*\\.\\d+)\\s+(\\byears|months|days|hours|minutes\\b)\\s+    (\\bago\\b)$";
Pattern p = p.compile(f);
Matcher m; 

if (m.find(retreiveRow(5))) { ...... }

任何帮助都会很棒!非常感谢!

pgpifvop

pgpifvop1#

您的示例数据:

12 days ago
1 minutes ago
5.8 hours ago
3.2 years ago

我的正则表达式:

/^([\d]+(?:\.\d)?)\s(years|months|days|hours|minutes)/

  (..............)  (...............................)

说明:

^([\d]+                              # match one or more digits
(?:\.\d)?)                           # followed by an optional period and digit
\s                                   # followed by a whitespace character
(years|months|days|hours|minutes)    # followed by a unit-of-time word

正则表达式下面的两对括号显示了合并到正则表达式中的两个捕获组(backreferences)。
尽管您的问题是关于java的,但这里有一个使用perl针对您的数据的regex的实时演示。这里还有perl代码供参考:


# !/usr/bin/perl -w

use strict;
use warnings;

my @buf;
while (<DATA>) {
    @buf = /^([\d]+(?:\.\d)?)\s(years|months|days|hours|minutes)/;
    print "[", join("][", @buf), "]\n";
}

__DATA__
12 days ago
1 minutes ago
5.8 hours ago
3.2 years ago

输出:

[12][days]
[1][minutes]
[5.8][hours]
[3.2][years]
7qhs6swi

7qhs6swi2#

作为java字符串: "^\\d+(\\.\\d+)?\\u0020(days|minutes|months|hours|years)\\u0020ago$" 作为普通正则表达式: ^\d+(\.\d+)?\u0020(days|minuits|hours|years)\u0020ago$ 我故意将空格限制为只有空格字符。似乎没有标签,所有的都适用于这里。

相关问题