Java正则表达式? (expr){num}感到困惑吗?

时间:2018-07-13 13:46:28

标签: java regex

我正在尝试识别仅包含一个整数的字符串。 恰好是一串连续的数字,例如“ 1234”(没有点,没有逗号)。

所以我认为应该这样做:(这与Java String Escapes一起使用):

(\\d+){1,}

因此,“ \ d +”正确是一串连续的数字。 (对吗?)

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

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

Pattern:(\d+){1,}
                  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

似乎模式中的'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

我在这里想念什么? 出于兴趣-如果我完全摘下“(”和“)”,我会再次得到不同的结果

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

5 个答案:

答案 0 :(得分:3)

Matcher.find()将尝试在字符串内找到匹配项。您应该尝试使用Matcher.matches()来查看模式是否适合所有字符串。

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

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

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

答案 1 :(得分:2)

这是正则表达式:

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

是零个或多个非数字,然后是数字的子字符串,然后又是零个或多个非数字,直到字符串末尾。这是Java代码(带有反斜杠):

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
      }         
}

答案 2 :(得分:1)

您可以使用RegEx ^\D*?(\d+)\D*?$

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

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

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

Demo.

因此,对于您的Java字符串,应为:^\\D*?(\\d+)\\D*?$

答案 3 :(得分:0)

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

为此,您可以匹配零个或多个非数字,然后匹配一个或多个数字,然后匹配零个或多个非数字。 以下应该可以解决问题:

private string zoneName = "Name from Constructor";
public override void OnRender(Graphics g)
{
    base.OnRender(g);

    // Measure the size of the text. 
    // You might want to add some extra space around your text. 
    // MeasureString is quite tricky...
    SizeF textSize = g.MeasureString(this.zoneName, SystemFonts.DefaultFont);

    // Get LocalPoint (your LatLng coordinate in pixel)
    Point localPosition = this.LocalPosition;

    // Move the localPosition by the half size of the text.
    PointF textPosition = new PointF((float)(localPosition.X - textSize.Width / 2f),(float)(localPosition.Y - textSize.Height / 2f));

    // Draw Background
    g.FillRectangle(SystemBrushes.Control, new RectangleF(textPosition, textSize));
    g.DrawString(this.zoneName, SystemFonts.DefaultFont, Color.Black, textPosition);
}

在regex101.com上:https://regex101.com/r/CG0RiL/2

答案 4 :(得分:-1)

编辑:正如Veselin Davidov指出的那样,我的正则表达式不正确。

如果我理解的正确,那么您只希望在整个String与模式匹配时才说是正确的。是吗?

然后您必须致电matcher.matches();

我还认为您的模式必须仅为\d+

如果您对正则表达式有疑问,我可以向您推荐https://regex101.com/,它向您解释了为什么它与某些内容匹配并为您提供了快速预览。

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