Regex для захвата групп - PullRequest
       2

Regex для захвата групп

2 голосов
/ 08 декабря 2010

Моя группа может иметь вид x / y, xy или x_y.z.Каждая группа отделена подчеркиванием.Группы неупорядочены.

Пример:

ABC/DEF_abc.def_PQR/STU_ghi_jkl.mno

Я хотел бы захватить следующее:

ABC/DEF
abc.def
PQR/STU
ghi_jkl.mno

Я сделал это, используя довольно многословную итерацию строки иметод синтаксического анализа (показан ниже), но мне интересно, может ли это выполнить простое регулярное выражение.

private static ArrayList<String> go(String s){
    ArrayList<String> list = new ArrayList<String>();
    boolean inSlash = false;
    int pos = 0 ;
    boolean inDot = false;
    for(int i = 0 ; i < s.length(); i++){
        char c = s.charAt(i);
        switch (c) {
        case '/':
            inSlash = true;
            break;
        case '_':
            if(inSlash){
                list.add(s.substring(pos,i));
                inSlash = false;
                pos = i+1 ;
            }
            else if (inDot){
                list.add(s.substring(pos,i));
                inDot = false;
                pos = i+1;
            }
            break;
        case '.':
            inDot = true;
            break;
        default:
            break;
        }

    }
    list.add(s.substring(pos));
    System.out.println(list);
    return list;
}

Ответы [ 4 ]

2 голосов
/ 08 декабря 2010

Попробуйте:

((?:[^_./]+/[^_./]+)|(?:[^_./]+\.[^_./]+)|(?:[^_./]+(?:_[^_./]+)+\.[^_./]+))

Я не знаю синтаксис Java, но в Perl:

#!/usr/bin/perl
use 5.10.1;
use strict;
use warnings;

my $str = q!ABC/DEF_abc.def_PQR/STU_ghi_jkl.mno_a_b_c.z_a_b_c_d.z_a_b_c_d_e.z!;
my $re = qr!((?:[^_./]+/[^_./]+)|(?:[^_./]+\.[^_./]+)|(?:[^_./]+(?:_[^_./]+)+\.[^_./]+))!;
while($str=~/$re/g) {
    say $1;
}

выдаст:

ABC/DEF
abc.def
PQR/STU
ghi_jkl.mno
a_b_c.z
a_b_c_d.z
a_b_c_d_e.z
0 голосов
/ 08 декабря 2010

Этот идет с положительным прогнозом вместо чередований

[A-Za-z]+(_(?=[A-Za-z]+\.[A-Za-z]+))?[A-Za-z]+[/.][A-Za-z]+
0 голосов
/ 08 декабря 2010

Это регулярное выражение, вероятно, подойдет (проверено с помощью регулярных выражений .Net):

[a-zA-Z]+[./][a-zA-Z]+|[a-zA-Z]+_[a-zA-Z]+\.[a-zA-Z]+

(Если вы знаете, что ваш ввод правильно сформирован, нет необходимости явно сопоставлять разделитель)

0 голосов
/ 08 декабря 2010

Может быть проблема с подчеркиванием, поскольку это не всегда разделитель.

Может быть: ((?<=_)\w+_)?\w+[./]\.w+

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