Java正则表达式和模式匹配:查找;“空白”;在不包括它们的模式中?
所以,我需要为家庭作业编写一个编译器扫描器,我认为使用正则表达式是“优雅的”。事实上,我以前很少使用它们,那是很久以前的事了。所以我忘了他们的大部分东西,需要四处看看。我成功地将它们用于标识符(或者至少我认为是这样,我还需要做一些进一步的测试,但现在它们看起来都不错),但我在数字识别方面有问题 函数Java正则表达式和模式匹配:查找;“空白”;在不包括它们的模式中?,java,regex,pattern-matching,Java,Regex,Pattern Matching,所以,我需要为家庭作业编写一个编译器扫描器,我认为使用正则表达式是“优雅的”。事实上,我以前很少使用它们,那是很久以前的事了。所以我忘了他们的大部分东西,需要四处看看。我成功地将它们用于标识符(或者至少我认为是这样,我还需要做一些进一步的测试,但现在它们看起来都不错),但我在数字识别方面有问题 函数nextCh()读取输入上的下一个字符(lookahead char)。我想在这里做的是检查这个字符是否与regex[0-9]*匹配。我在当前令牌的str字段中追加每个匹配字符,然后读取该字段的int
nextCh()
读取输入上的下一个字符(lookahead char)。我想在这里做的是检查这个字符是否与regex[0-9]*
匹配。我在当前令牌的str
字段中追加每个匹配字符,然后读取该字段的int值。它识别单个数字输入,如“123”,但我的问题是,对于输入“123 456”,最后的str将是“123 456”,而我应该得到两个单独的标记,字段为“123”和“456”。为什么要匹配“”呢
private void readNumber(Token t) {
t.str = "" + ch; // force conversion char --> String
final Pattern pattern = Pattern.compile("[0-9]*");
nextCh(); // get next char and check if it is a digit
Matcher match = pattern.matcher("" + ch);
while (match.find() && ch != EOF) {
t.str += ch;
nextCh();
match = pattern.matcher("" + ch);
}
t.kind = Kind.number;
try {
int value = Integer.parseInt(t.str);
t.val = value;
} catch(NumberFormatException e) {
error(t, Message.BIG_NUM, t.str);
}
谢谢大家!
PS:我确实用下面的代码解决了我的问题。然而,我想了解我的正则表达式中的缺陷在哪里
t.str = "" + ch;
nextCh(); // get next char and check if it is a number
while (ch>='0' && ch<='9') {
t.str += ch;
nextCh();
}
t.kind = Kind.number;
try {
int value = Integer.parseInt(t.str);
t.val = value;
} catch(NumberFormatException e) {
error(t, Message.BIG_NUM, t.str);
}
t.str=”“+ch;
nextCh();//获取下一个字符并检查它是否为数字
虽然(ch>='0'&&ch我不能100%确定这是否与您的情况相关,但是:
Pattern.compile("[0-9]*");
匹配字符串中任意位置的零个或多个数字,因为有星号。我认为空格匹配是因为它与“零数字”匹配。如果要确保字符是数字,则必须使用加号匹配一个或多个:
Pattern.compile("[0-9]+");
或者,由于一次只比较一个字符,只需匹配一个字符即可:
Pattern.compile("^[0-9]$");
使用更简单的正则表达式,如
/\d+/
在哪里
\d
表示数字
+
表示一个或多个
代码:
final Pattern pattern = Pattern.compile("\\d+");
您应该使用匹配
方法,而不是查找
方法。从文档中:
matches方法尝试根据模式匹配整个输入序列
find方法扫描输入序列,寻找与模式匹配的下一个子序列
换句话说,通过使用find
,如果字符串的任何位置都包含一个数字,您将获得一个匹配,但是如果使用matches
,则整个字符串必须与模式匹配
例如,尝试以下方法:
Pattern p = Pattern.compile("[0-9]*");
Matcher m123abc = p.matcher("123 abc");
System.out.println(m123abc.matches()); // prints false
System.out.println(m123abc.find()); // prints true
我试过了3。有了你的两个额外的可能性,不幸的是我甚至没能检测到“123”数字…我可能需要重新检查代码。另一个问题:你能告诉我^symbol是什么吗?我真的无法按照前几天找到的示例进行操作。^
表示字符串将从开头匹配。$
表示从结尾匹配。因此,如果你用^
和$
预订正则表达式,则,这意味着字符串必须完全匹配。如果没有它们,像'rdpa5'
这样的东西将与'5'
一样匹配,因为字符串中的某个地方存在一个数字。当然,如果每次只比较一个字符,我不认为书尾有多大区别。顺便说一下,如果不是matc再加上斜杠,可能是因为你包含了正斜杠。如果你像现在这样使用构造函数构造RegExp,你就不需要它们了。我会更新答案……这不太正确。OP使用的模式很好,是Matcher
方法错了。请看我的答案。哦,酷!关于所以,即使你没有问这个问题,你也可以学到一些东西:-d可能我现在做java已经太晚了(凌晨3:30)。我试图放置你的正则表达式,但eclipse告诉我\d是无效的转义序列…谢谢编辑。不幸的是,它找不到任何数字(我明天会调试,看看它到底在做什么)…这很奇怪