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