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是无效的转义序列…谢谢编辑。不幸的是,它找不到任何数字(我明天会调试,看看它到底在做什么)…这很奇怪