Java регулярное выражение: (идентификатор C, а затем __) - PullRequest
1 голос
/ 06 сентября 2011

Я ищу способ сопоставления идентификатора C с последующим двойным подчеркиванием.Но вот в чем дело: мне нужно, чтобы он не был жадным, если идентификатор заканчивается серией подчеркиваний.

Я почти получил его с помощью ^([_A-Za-z][_A-Za-z0-9]*?)__, но есть хитрый набор случаев, когда идентификатор может заканчиваться насерия символов подчеркивания:

string          expected identifier
abcd0__         abcd0
abcd0___        abcd0_
abcd0____       abcd0__
abcd__0__       abcd
abcd___0__      abcd_
abcd____0__     abcd__

Есть ли способ, которым я могу изменить регулярное выражение для получения ожидаемого совпадения группы, указанного выше?

Ниже приведена тестовая программа, которая печатает неверный вывод:

abcd0__ -> match is abcd0
abcd0___ -> match is abcd0
abcd0____ -> match is abcd0
abcd__0__ -> match is abcd
abcd___0__ -> match is abcd
abcd____0__ -> match is abcd

Regex3.java:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex3 {
    final static private Pattern pattern = 
       Pattern.compile("^([_A-Za-z][_A-Za-z0-9]*?)__");

    static public void main(String[] args)
    {
        String[] items = {
                "abcd0__",
                "abcd0___",
                "abcd0____",
                "abcd__0__",
                "abcd___0__"
                "abcd____0__"
        };
        for (String item : items)
            test(item);
    }
    private static void test(String item) {
        Matcher m = pattern.matcher(item);
        if (m.find())
        {
            System.out.println(item+" -> match is "+m.group(1));
        }
        else
        {
            System.out.println(item+" -> no match");            
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

^[_A-Za-z](?:_?[A-Za-z0-9])*_*(?=__)

В JavaScript в оболочке без квадратов,

var re = /^[_A-Za-z](?:_?[A-Za-z0-9])*_*(?=__)/
var arr = ["abcd0__", "abcd0___", "abcd0____", "abcd__0__", "abcd___0__",
           "abcd____0__", "abcd", "abcd_"]
for (var i = 0; i < arr.length; i++) {
  print(arr[i] + " : " + re.exec(arr[i]));
}

производит

abcd0__ : abcd0
abcd0___ : abcd0_
abcd0____ : abcd0__
abcd__0__ : abcd
abcd___0__ : abcd_
abcd____0__ : abcd__
abcd : null
abcd_ : null
1 голос
/ 06 сентября 2011

Шаблон ^([_A-Za-z][_A-Za-z0-9]*?_*)_{2} должен соответствовать идентификатору, который вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...