Regex помогите с расщеплением строки - PullRequest
1 голос
/ 19 декабря 2009

Мне нужно разобрать строки, подобные этим:

kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three

-+gdl+-kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three

kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three-+gdl+-

и во всех трех случаях распознают эти три группы:

kev-+kvs+-one

greg-+kvs+-two

les-+kvs+-three

Другими словами, для разделения строки следует использовать строку - + gdl + -.

Предположим, что последовательность - + gdl + - не будет возникать, кроме как в качестве разделителя.

Как бы я написал для этого регулярное выражение?

Ответы [ 7 ]

1 голос
/ 19 декабря 2009

Короче, вам нужно следующее регулярное выражение:

-\+gdl\+-

Следующий Java-код может сделать это, распечатав количество токенов и сами токены:

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

public class Regex {
    public static void main(String[] args) {
        String text = "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three";
        String regex = "-\\+gdl\\+-";
        Pattern p = Pattern.compile(regex);
        String[] tokens = p.split(text);
        System.out.println("Found " + tokens.length + " tokens");
        for (String token: tokens) {
            System.out.println("Found " + token);
        }
    }
}
1 голос
/ 19 декабря 2009

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

Пример, но я не знаю, какой язык вы используете

 "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three".split("-+gdl+-")
0 голосов
/ 20 декабря 2009

Я не уверен, какой язык программирования вы используете. Если вы используете языки программирования высокого уровня, такие как Java, Python довольно прост, как указано в большинстве из них, вы найдете функцию разделения.

Если вы используете командную строку, такую ​​как приглашение bash, я бы использовал sed

$ str = "kev- + kvs + -one- + gdl + -greg- + kvs + -two- + gdl ..."

$ для i в `` echo $ str | sed 's / - + gdl + - / / g' ; сделать эхо $ я; сделано

+ КВС к + -он

greg- + КВС + -две

les- + КВС + -три

+ КВС к + -он

greg- + КВС + -две

les- + КВС + -threekev- + КВС + -он

greg- + КВС + -две

les- + КВС + -три

Или в Perl вы можете сделать немного по-другому

$ echo $ str | perl -pe 's /(.*?)-+ gdl + - / $ 1 \ n / g'

0 голосов
/ 19 декабря 2009

Я не уверен, какой язык вы ищете, но в Ruby вы можете просто использовать [String#split] 1 (и вам не нужно регулярное выражение, простой строковый параметр подойдет ):

>> strings = ["kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three",
              "-+gdl+-kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three",
              "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three-+gdl+-"]
>> split = strings.map {|s| s.split "-+gdl+-"}
=> [["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["", "kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"]]

Обратите внимание, что это имеет проблему с введением пустых полей в начале или в середине вашей строки. Если вам не нужны пустые поля, вам, вероятно, придется отфильтровать их впоследствии:

>> split.map {|a| a.reject {|s| s == ""}}
=> [["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"]]

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

0 голосов
/ 19 декабря 2009

Вы можете решить это с помощью регулярного выражения, просто используйте -+gdl+- в качестве шаблона для разбиения. Что нужно избежать, зависит от вашего вкуса регулярных выражений.

РЕДАКТИРОВАТЬ после вашего комментария: вы можете сделать это с совпадением, но это добавляет ненужную сложность. Это также зависит от языка, например в PHP

preg_match_all('/(.*?)(?:-\+gdl\+-|$)/', $string, $match);

вы получите пустые спички.

0 голосов
/ 19 декабря 2009

Большинство библиотек регулярных выражений имеют функцию разделения. Вы просто вызываете эту функцию с аргументом + gdl +, и она возвращает вам массив. Детали варьируются от языка к языку.

Однако вам даже не нужно регулярное выражение. Многие языковые библиотеки будут иметь функцию разделения на "+ gdl +". Какой язык вы используете?

0 голосов
/ 19 декабря 2009
.*?\-\+gdl\+\-.*?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...