Мой Regex не работает, как я ожидал - PullRequest
0 голосов
/ 22 марта 2012

Вот мой шаблон регулярных выражений:

[A-Z][a-z]?-?([A-Z][a-z]?)?

Я хочу, чтобы это регулярное выражение соответствовало следующему:

A
Ab
Ef-G
Hi-Jk
F-Tk
F-D

Я отправляю это "M-F", и оно совпадает только с "F", я хочу, чтобы оно совпадало со всей строкой "M-F".

Вот мой код Java (но, надеюсь, вам не нужно его читать):

// Convert the daycode string into an array of daycodes
ArrayList<String> newDP = new ArrayList<String>();

Pattern regex = Pattern.compile("[A-Z][a-z]?-?([A-Z][a-z]?)?", Pattern.UNICODE_CASE);
Matcher regexMatcher = regex.matcher(dayPattern);
while (regexMatcher.find())
{
  for (int i = 1; i <= regexMatcher.groupCount(); i++)
  {
    newDP.add(regexMatcher.group(i));
  }
}

Помогите мне? Пожалуйста и спасибо.

Edit: Мне также нужно, чтобы это масштабировалось так, чтобы при вводе:

MTu-ThFSa

Возвращает вывод:

["M", "Tu-Th", "F", "Sa"]

Ответы [ 2 ]

4 голосов
/ 22 марта 2012

Принудительно сопоставляет всю строку, используя anchors : ^[A-Z][a-z]?-?([A-Z][a-z]?)?$

Хотя вам, вероятно, следует немного изменить группировки, чтобы они действительно соответствовали только этим.Что-то вроде:

^[A-Z]  ([a-z]  (-  ([A-Z]  ([a-z])?  )?  )?  )?$
        |-------------------------------------|
                |-------------------------|
                    |-----------------|
                            |-----|
1 голос
/ 22 марта 2012

Ваша проблема в том, что вы добавляете только группы 1 и более:

for (int i = 1; ...

При совпадении с регулярным выражением группа 0 - это общее совпадение.Группа 1 в вашем примере - это просто группа во вторых скобках: ([A-Z][a-z]?)?.

Вы должны просто изменить свой цикл на группу 0, что будет полным совпадением:

while (regexMatcher.find())
{
    newDP.add(regexMatcher.group(0));
}

Для редактирования в исходном сообщении:

Вот фиксированное регулярное выражение:

[A-Z][a-z]?(-[A-Z][a-z]?)?

Дефис должен быть разрешен только при наличии следующей буквы.

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