Java 如何为以下场景编写正则表达式模式

Java 如何为以下场景编写正则表达式模式,java,regex,Java,Regex,任何人都可以给我一些正则表达式模式,从一些示例字符串中提取版本号(1.5),比如 "jdk1.5","jdk-v1.5","jdk-V1.5","jdk V1.5","jdkv1.5","jdk version1.5","1.5.6","v1.5","V1.5","version 1.5","Version 1.5","14.5.4","1.5.4","14.5.4""jdj14.5" 我想将正则表达式模式存储在一个字符串数组中,并用上面的字符串检查这些模式。如果与任何存储模式匹配,则

任何人都可以给我一些正则表达式模式,从一些示例字符串中提取版本号(1.5),比如

    "jdk1.5","jdk-v1.5","jdk-V1.5","jdk V1.5","jdkv1.5","jdk version1.5","1.5.6","v1.5","V1.5","version 1.5","Version 1.5","14.5.4","1.5.4","14.5.4""jdj14.5"
我想将正则表达式模式存储在一个字符串数组中,并用上面的字符串检查这些模式。如果与任何存储模式匹配,则输出的版本号应为1.5。我只想从上面的字符串中提取版本号(1.5)

有效字符串格式: “jdk1.5”、“jdk-v1.5”、“jdk-v1.5”、“jdk v1.3”、“jdkv1.4”、“jdk version1.5”、“1.5.6”、“v1.5”、“v1.5”、“version1.5”、“version1.5”、“version1.5”、“14.5.4”、“1.5.4”、“14.5.4”、“jdj14.5”、“14.52.3.42”

无效的字符串格式:“jdk1..2”、“jdk.1.2.”、“.1.2.”

请尝试:

^(jdk[- ]?)?([vV](ersion)? ?)?\d\.\d(\.\d)?$
如果设置了不区分大小写的标志,则可以使用
v
命令来操作
[vV]

尝试:

^(jdk[- ]?)?([vV](ersion)? ?)?\d\.\d(\.\d)?$

如果设置了
不区分大小写的
标志,则可以使用
v
操作
[vV]

如果要捕获两个以上的数字,如“1.5.6”或“1.5.0”,则可以使用

[0-9]([0-9])+

或者如果您只需要前两个数字
[0-9].[0-9]
,但这对像1.5.0.0这样的字符串不起作用,它将捕获1.5和0.0。

如果您想捕获两个以上的数字,如“1.5.6”或“1.5.0”,可以使用

[0-9]([0-9])+

或者如果您只需要前两个数字
[0-9].[0-9]
,但这对像1.5.0.0这样的字符串不起作用,它将捕获1.5和0.0。

尝试以下正则表达式:


(?尝试以下正则表达式:

(?要求
如果你能将你想要的公式化为:

  • 默认情况下,
    1.5
    1.5.6
    1.5.6.7
    1.5.6.7.8
    等格式的任何内容都是有效的版本号(数字可以是一个或多个数字,如
    12.60.70
  • 只有在版本号
    1.5.6
    的格式下,才可以在版本号
    1.5
    后加一个点(
  • 版本号
    1.5
    前面从来没有像
    .1.5
    那样的点(
  • 解决方案 那么,我可以向您推荐这个正则表达式:

    (?!\.)(\d+(\.\d+)+)(?![\d\.])
    
    查看它,包括所有阳性样本,排除您提供的所有阴性样本

    如何使用 第一个捕获组将是您的版本号。示例代码:

    Pattern pattern    = Pattern.compile("(?!\\.)(\\d+(\\.\\d+)+)(?![\\d\\.])");
    Matcher matcher    = pattern.matcher(inputStr);
    boolean matchFound = matcher.find();
    
    if (matchFound)
    {
        String version = matcher.group(1);
        System.out.println("Version number: " + version);
    }
    else
    {
        System.out.println("No match for the input!");
    }
    
    注意:这只适用于Java 7+,因为旧版本不支持look aheads。

    要求 如果你能将你想要的公式化为:

  • 默认情况下,
    1.5
    1.5.6
    1.5.6.7
    1.5.6.7.8
    等格式的任何内容都是有效的版本号(数字可以是一个或多个数字,如
    12.60.70
  • 只有在版本号
    1.5.6
    的格式下,才可以在版本号
    1.5
    后加一个点(
  • 版本号
    1.5
    前面从来没有像
    .1.5
    那样的点(
  • 解决方案 那么,我可以向您推荐这个正则表达式:

    (?!\.)(\d+(\.\d+)+)(?![\d\.])
    
    查看它,包括所有阳性样本,排除您提供的所有阴性样本

    如何使用 第一个捕获组将是您的版本号。示例代码:

    Pattern pattern    = Pattern.compile("(?!\\.)(\\d+(\\.\\d+)+)(?![\\d\\.])");
    Matcher matcher    = pattern.matcher(inputStr);
    boolean matchFound = matcher.find();
    
    if (matchFound)
    {
        String version = matcher.group(1);
        System.out.println("Version number: " + version);
    }
    else
    {
        System.out.println("No match for the input!");
    }
    

    注意:这只适用于Java 7+,因为旧版本不支持look aheads。

    对于1.5.6之类的字符串,您可以使用:
    [0-9]([0-9])+

    对于像1.5.6这样的字符串,您可以使用:
    [0-9]([0-9])+

    检查这个

    它将匹配表单的字符串

    number.number.number.number.number

    没有后面或前面有点的(

    检查这个

    它将匹配表单的字符串

    number.number.number.number.number

    后面或前面没有点的使用正则表达式:

    (^([jJ][dD][kK])([\s]*[vV]*\d+.\d+(.\d+)*))$
    
    这将使您的一天:)

    使用正则表达式:

    (^([jJ][dD][kK])([\s]*[vV]*\d+.\d+(.\d+)*))$
    

    这会让你开心:)

    @hsz是的,我在回答中已经提到了这一点,并征求了一些建议。对不起,我没有注意到:)但是你应该使用
    ^
    $
    来确保整个字符串都经过了测试。如果这样做,你的正则表达式就不起作用了:-(您好,我不仅可以有三个精度。但比这更高的精度,如1.2.3.4或14.5.6也是有效的。@hsz是的,我在回答中已经提到了这一点并征求了建议。对不起,我没有注意到:)但是您应该使用
    ^
    $
    来确保整个字符串都经过了测试。如果这样做,您的正则表达式不起作用:-(嗨,我不仅可以有三个精度。但比这更高的精度,如1.2.3.4或14.5.6也是有效的。嗨,谢谢你的帮助…但我仍然想匹配1.6.2或任何版本号与句点…例如1.2.5或1.2.5.6好的,我根据你最后的评论更改了我的答案。看看它是否有效。谢谢…但问题是它与字符串1.25.655。(请参见此处末尾有一个点)。它返回1.25.65。但版本号不正确:(你能告诉我怎么用java写这个吗?我想要匹配的版本号作为输出。感谢反例,我正确地修正了我的答案,并用示例代码进行了解释。请给我反馈结果。嗨,mmdemirbas,谢谢你帮我完成这个问题。它工作得很好。但是pa有一些问题再次rsing。如果字符串是“DB2 10.5修复”,则返回2 10.5。如果有类似“DB2 release 2009”的年份,则返回2009..您能帮我解决最后一个修复吗(您好,谢谢您的帮助…但我仍然希望将1.6.2或任何版本号与句点匹配…例如1.2.5或1.2.5.6好的,我根据您最后的评论更改了我的答案。看看它是否有效。谢谢…但问题是它与字符串1.25.655匹配。(请参见结尾处的点).返回1.25.65.但版本号不正确:(你能解释一下怎么做wri吗