繁体   English   中英

如何以这种格式编写Java模式:任何字符(int,int)(int,int)数字数字(int,int,int)

[英]how to write a java pattern in this format: any characters (int,int) (int,int) number number any number of (int,int,int)

例如

Maze0.bmp (0,0) (319,239) 65 120
Maze0.bmp (0,0) (319,239) 65 120 (254,243,90)  
Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) (0,0,0)
Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) (0,0,0) (11,33,44)

我想获取maze0.bmp和所有数字。 我有:

Pattern pattern = Pattern.compile("([A-z][^\\s]*)\\s+\\((\\d+),(\\d+)\\)\\s+\\((\\d+),(\\d+)\\)\\s+(\\d+)\\s+(\\d+)\\s+(\\((\\d+),(\\d+),(\\d+)\\)\\s*)"); 
BufferedReader stdin = new BufferedReader(new InputStreamReader( System.in));
String input;
Matcher matcher = null; 
boolean isMatched = false; 
while (!isMatched) {
    System.out.println("Please enter right format\n");
    input = stdin.readLine(); 
    matcher = pattern.matcher(input); 
    while(matcher.find()) {
        isMatched = true; 
        for (int i = 1; i <= matcher.groupCount(); ++i) 
            System.out.println(matcher.group(i));
    }
}

没错 例如,如果我的输入是

Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) (0,0,0)

它无法获取最后一个元组(0,0,0)。

这是我能想到的最好的。 请注意,我使用了两种模式,因为出于某种原因Java拒绝捕获重复的组(如果有人碰巧知道原因,请plz发表评论)。

final Pattern outerPattern = Pattern.compile("(.*?) \\((\\d+),(\\d+)\\) \\((\\d+),(\\d+)\\) (\\d+) (\\d+)(.*)");
final Pattern optionalTouplePattern = Pattern.compile(" \\((\\d+),(\\d+),(\\d+)\\)");

final BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
boolean isMatched;

do
{
    System.out.println("Please enter right format:");
    Matcher m = outerPattern.matcher(stdin.readLine());
    if (isMatched = m.find())
    {
        System.out.println(String.format("name='%s', first touple: [%s,%s], second touple: [%s,%s], first single number: %s, second single number: %s", m.group(1), m.group(2), m.group(3), m.group(4), m.group(5), m.group(6), m.group(7)));
        m = optionalTouplePattern.matcher(m.group(8));
        while(m.find())
        {
            System.out.println(String.format("+ optional touple: [%s,%s,%s]", m.group(1), m.group(2), m.group(3)));
        }
    }
}while(!isMatched);

好的,对不起,我必须进行修改。 Java匹配器似乎不喜欢无法在正则表达式的编译时确定的模式计数。 但这有效(经过测试):

Matcher m = Pattern.compile("\\((\\d+),(\\d+),(\\d+)\\)").matcher("(23,56,78) (54,22,11)");
while(m.find())
{
  for(int i = 1; i <= m.groupCount(); ++i)
  System.out.println(m.group(i));
}

我不知道Java中匹配的上下文,但是我非常了解regex。 试试这个上下文:

while matching BITMAP records is not done
  ("
     ([A-z][^\s])            'maze.bmp'   ~ group 1
     \s+
     \(  (\d+),(\d+)  \)     '0' '0'      ~ group 2,3
     \s+
     \( (\d+),(\d+) \)       '319'  '239' ~ group 4,5
     \s+
     (\d+)                   '65'         ~ group 6
     \s+
     (\d+)                   '120'        ~ group 7
     \s+
     (
       (?: \( \d+,\d+,\d+ \) \s+ )+       '(254,243,90) (0,0,0) '     ~ group 8
     )
  ") - context = global
{
      // save to BITMAP.array (groups 1 - 7)
      copy group 8 to variable '(254,243,90) (0,0,0) '
      new matching of TUPLES, group 8 is the regex subject for this new match
         ("
            (\d+)
         ") - context = global

      append TUPLES.array (254 243 90 0 0 0)
      to BITMAP.array (maze.bmp 0 0 319 239 65 120 <append> 254 243 90 0 0 0)

     // do next BITMAP record
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM