正则表达式不考虑空间

时间:2017-08-26 21:33:17

标签: java regex

我在java中有以下正则表达式 -

Pattern p = Pattern.compile("int|float|char\\s\\w");

但这仍然匹配“intern”。

整个代码 -

package regex;

import java.io.*;
import java.util.*;
import java.util.regex.*;

public class Regex {

    public static void main(String[] args) throws IOException{
        // TODO code application logic here
        int c = 0;
        BufferedReader bf = new BufferedReader(new FileReader("new.c"));
        String line;
        Pattern p = Pattern.compile("int|float|char\\s\\w");
        Matcher m;
        while((line = bf.readLine()) != null) {
            m = p.matcher(line);
            if(m.find()) {
                c++;
            }
        }
        System.out.println(c);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为你的意思是找到一个替代方案,然后是一个空格和一个单词。

但是

 (?:
      int
   |                    # or,
      float
   |                    # or,
      char \s \w
 )

您可以从列表中看到\s\w仅适用于char替代方案。

要解决此问题,请将该组的\s\w 置于之外,以便它适用于所有
替代方案。

 (?:
      int
   |                    # or,
      float
   |                    # or,
      char 
 )
 \s \w

最后的正则表达式是"(?:int|float|char)\\s\\w"

答案 1 :(得分:0)

用括号括起选项,如下所示:

Pattern p = Pattern.compile("(int|float|char)\\s\\w");

此外,如果您想要覆盖一些边缘情况以处理一些格式错误的代码,您可以使用:

Pattern p = Pattern.compile("^(\\s|\\t)*(int|float|char)(\\s|\\t)+[a-zA-Z_][a-zA-Z0-9_]*(\\s|\\t)*");

这应该涵盖类型和变量名之间有多个空格或制表符的情况,并且还包括以下划线开头的变量名称,以及“int”“float”或“char”是某些结尾的情况字。