Java 正则表达式模式-仅当用连字符分隔时才提取字符串

Java 正则表达式模式-仅当用连字符分隔时才提取字符串,java,regex,Java,Regex,我看了其他的问题,但没有找到答案 我有这个密码: Pattern p = Pattern.compile("exp_(\\d{1}-\\d)-(\\d+)"); 我想要匹配的字符串是:exp_5-22-718 我想提取5-22和718。我不太清楚为什么它不起作用我错过了什么?非常感谢如果字符串的前缀总是exp\uu,我不会使用正则表达式 我想: exp - 注意:此答案基于假设。如果你有多个连字符,我会提供一个更健壮的。但是,如果您需要验证数字的格式,则正则表达式可能会更好。如果字符串始终

我看了其他的问题,但没有找到答案

我有这个密码:

Pattern p = Pattern.compile("exp_(\\d{1}-\\d)-(\\d+)");
我想要匹配的字符串是:
exp_5-22-718


我想提取
5-22
718
。我不太清楚为什么它不起作用我错过了什么?非常感谢

如果字符串的前缀总是
exp\uu
,我不会使用正则表达式

我想:

  • exp
  • -

注意:此答案基于假设。如果你有多个连字符,我会提供一个更健壮的。但是,如果您需要验证数字的格式,则正则表达式可能会更好。

如果字符串始终以
exp\uuu
作为前缀,我不会使用正则表达式

我想:

  • exp
  • -
注意:此答案基于假设。如果你有多个连字符,我会提供一个更健壮的。但是,如果您需要验证数字的格式,则正则表达式可能更好。

尝试以下方法:

Pattern p = Pattern.compile("exp_(\\d-\\d+)-(\\d+)");
在您的原始模式中,您指定第二个数字应该正好包含一个数字,因此我将
\d+
放入以匹配尽可能多的数字。 另外,我从第一个数字定义中删除了
{1}
,因为它不会给regexp添加值。

试试这个:

Pattern p = Pattern.compile("exp_(\\d-\\d+)-(\\d+)");
在您的原始模式中,您指定第二个数字应该正好包含一个数字,因此我将
\d+
放入以匹配尽可能多的数字。
此外,我还从第一个数字定义中删除了
{1}
,因为它不会为regexp添加值。

在regexp中,您遗漏了第二个数字
\\d
所需的量词。这个量词是
+
{2}

    String yourString = "exp_5-22-718";

    Matcher matcher = Pattern.compile("exp_(\\d-\\d+)-(\\d+)").matcher(yourString);
    if (matcher.find()) {
        System.out.println(matcher.group(1)); //prints 5-22
        System.out.println(matcher.group(2)); //prints 718
    }

在regexp中,第二个数字
\\d
缺少必需的量词。这个量词是
+
{2}

    String yourString = "exp_5-22-718";

    Matcher matcher = Pattern.compile("exp_(\\d-\\d+)-(\\d+)").matcher(yourString);
    if (matcher.find()) {
        System.out.println(matcher.group(1)); //prints 5-22
        System.out.println(matcher.group(2)); //prints 718
    }

可以使用string.split方法执行此操作。检查以下代码。 我假设您的字符串以“exp\ux”开头


可以使用string.split方法执行此操作。检查以下代码。 我假设您的字符串以“exp\ux”开头


是否总是有两个连字符?您忘记了第二个
\\d
后面的量词。使用exp(\\d-\\d+)(\\d+)@RohitJain-就是这样!该死,我现在觉得自己很蠢。谢谢。总是有两个连字符吗?你忘记了第二个
\\d
后面的量词。使用exp(\\d-\\d+)(\\d+)@RohitJain-就是这样!该死,我现在觉得自己很蠢。谢谢。这不起作用,因为op需要
5-22
718
而不是
5
22
718
谢谢你的回答字符串将只有两个连字符。所有字符串都将按照上面的示例构造。这就是我想使用正则表达式的原因(另外,我将使用正则表达式进行文件筛选。@Some1.Kill.the.DJ,明白了。您可以将它们重新组合在一起。这个答案是作为正则表达式的替代方案提供的。如前所述,它是基于假设的。不过感谢您的否决票。即使您仅在第二个连字符上拆分它,也会使事情变得复杂另一方面,当您可以使用
regex
并通过
组访问所需数据时
这将不起作用,因为op需要
5-22
718
而不是
5
22
718
谢谢您的回答,字符串将只有两个连字符。所有字符串将按照示例进行结构这就是为什么我要使用正则表达式(另外,我将使用正则表达式进行文件筛选。@Some1.Kill.the.DJ,明白了。您可以将它们重新组合在一起。这个答案是作为正则表达式的替代方案提供的。如前所述,它是基于假设的。不过感谢您的否决票。即使您仅在第二个连字符上拆分它,也会使事情变得复杂另一方面,当您可以使用
regex
并通过
组访问所需数据时
我应该提到我使用regex是因为我想应用文件过滤器。不过感谢您提供的替代方法!我应该提到我使用regex是因为我想应用文件过滤器。不过感谢您提供的替代方法!