Java正则表达式?(expr){num}混乱?

Java正则表达式?(expr){num}混乱?,java,regex,Java,Regex,我试图识别只包含一个整数的字符串。 这正好是一个连续数字串,例如“1234”(无点,无逗号) 所以我认为应该这样做:(包括Java字符串转义): 因此“\d+”正确地表示连续数字的字符串。(对吗?) 我将这个表达式作为子表达式包含在“(“and”)”中,然后我试图说“只有一个子表达式” 以下是(matcher.find())检查各种字符串的结果: (请注意,从现在开始的正则表达式在这里是“原始的”——而不是转义的Java字符串) 模式中的“1”似乎应用于“+\d”字符串,而不是这些连续字符串的数

我试图识别只包含一个整数的字符串。 这正好是一个连续数字串,例如“1234”(无点,无逗号)

所以我认为应该这样做:(包括Java字符串转义):

因此“\d+”正确地表示连续数字的字符串。(对吗?)

我将这个表达式作为子表达式包含在“(“and”)”中,然后我试图说“只有一个子表达式”

以下是(matcher.find())检查各种字符串的结果: (请注意,从现在开始的正则表达式在这里是“原始的”——而不是转义的Java字符串)

模式中的“1”似乎应用于“+\d”字符串,而不是这些连续字符串的数量

因为如果我将数字从1更改为4,我可以看到结果更改为以下内容:

Pattern:(\d+){4,}
                  Input String                        Result
                             1                         false
                       XX-1234                          true
      do-not-match-no-integers                         false
         do-not-match-1234-567                          true
          do-not-match-123-456                         false
我错过了什么? 出于兴趣——如果我把“(“and”)”完全去掉——我又会得到一个不同的结果

Pattern:\d+{4,}
              Input String                        Result
                         1                          true
                   XX-1234                          true
  do-not-match-no-integers                         false
     do-not-match-1234-567                          true
      do-not-match-123-456                          true
您可以使用正则表达式

  • ^\D*?
    确保行首和第一组之间没有数字

  • (\d+)
    与您的数字匹配

  • \D*?$
    确保第一组和行尾之间没有数字


因此,对于Java字符串,它应该是:
^\\D*?(\\D+)\\D*?$
编辑:正如Veselin Davidov指出的,我的正则表达式不正确

如果我没弄错的话,你只想在整个字符串与模式匹配时才说true,是吗

然后必须调用
matcher.matches();

另外,我认为您的模式必须是
\d+

如果你对正则表达式有问题,我可以向你推荐它,它解释了为什么它匹配某些东西,并给你一个快速预览

我每次必须编写正则表达式时都使用它。

这是正则表达式:

^[^\d]*\d+[^\d]*$   
这是零个或多个非数字,后跟一个子串数字,然后是零个或多个非数字,直到字符串结束。以下是java代码(带转义斜杠):

Matcher.find()

这样,您需要的模式是
\d+

编辑: 似乎我误解了这个问题。使用相同的模式来确定字符串是否只有一个整数的一种方法是:

int matchCounter = 0;
while (Matcher.find() || matchCounter < 2){
   matchCounter++;
}
return matchCounter == 1
int matchCounter=0;
while(Matcher.find()| | matchCounter<2){
matchCounter++;
}
返回matchCounter==1

我认为您必须确保您的正则表达式考虑整个字符串,使用^和$

为此,您可以匹配零个或多个非数字,后跟1个或多个数字,然后匹配零个或多个非数字。 下面应该可以做到这一点:

^[^\d]*(\d+)[^\d]*$

这里是在regex101.com上:

(\d+{4,}
和类似的平均匹配4个或更多连续出现的1个或多个数字,基本上,=
\d{4,}
。可能您想要
^\D*\D+\D*$
=>或者您需要匹配一个只包含数字的字符串吗?just\D+的问题是,如果他有一个数字,它会匹配,但是如果他有多个数字,它也会匹配是的,但如果他使用。matches()正则表达式必须匹配整个字符串。是的,但这对XX-1234不起作用。例如,他希望字符串中只有一个数字。但是字符串可以由多个数字组成。“XX-1234”。匹配(\\d+))是假的,但在问题中应该是真的哦,你说的对。看起来我对这个问题读得不够好。是的,但这对XX-1234不起作用。他只想在字符串中有一个数字。但是字符串可以由多个数字组成。“XX-1234”。匹配(\\d+”)是假的,但在问题中它应该是真的。这个问题有点混乱,因为它不清楚(在回答的时候)哪一个是预期的结果。感谢您提到“find()”和“matches()”-我还没有决定哪一个最适合我。(最后我选择了“matches()”)是的,这对我很有用:我明白了:你基本上是说“一些无数字(或无)+一串数字(仅包括1)+一些无数字(或无)。
class MainClass {
      public static void main(String[] args) {
        String regex="^[^\\d]*\\d+[^\\d]*$";
        System.out.println("1".matches(regex));  // true
        System.out.println("XX-1234".matches(regex)); // true
        System.out.println("XX-1234-YY".matches(regex)); // true
        System.out.println("do-not-match-no-integers".matches(regex)); // false
        System.out.println("do-not-match-1234-567".matches(regex)); // false
        System.out.println("do-not-match-123-456".matches(regex)); // false
      }         
}
int matchCounter = 0;
while (Matcher.find() || matchCounter < 2){
   matchCounter++;
}
return matchCounter == 1
^[^\d]*(\d+)[^\d]*$