unv

Парсинг JavaScript одним регулярным выражением

Nov 12, 2008 02:11

Вот таким вот:

(?:(\s+)|(/\*[\s\S]*?(?:\*/|$))|(//[^\r\n]*(?:\r\n?|\n|$))|('(?:[^\\'\r\n]++|\\.)*(?:'|$))|("(?:[^\\"\r\n]++|\\.)*(?:"|$))|((?<=[!%&(*+,./:;<=>?\[{^|}~-]\s{0,16})/(?:[^\\\/\r\n]|\\.)*/\w*)|([!%&()*+,./:;<=>?\[\]{^|}~-])|(\b(?>with|while|volatile|void|var|typeof|try|true|transient|throws|throw|this|synchronized|switch|super|static| ( Read more... )

выражения, регулярные, javascript, xml, regular expressions, regexp, java

Leave a comment

Comments 6

lerm_ru November 12 2008, 20:39:45 UTC
Забыл добавить номера групп к первому регэкспу и неверные номер последней группы у второго...

А можешь привести пример использования регэкспа - в смысле кода? Т.е. как подсветка делается?

Reply

unv November 12 2008, 21:33:14 UTC
Поправил. Странно, что явных ошибок всего две, учитывая, что оно в ночи переписывалось :)

Обвязочный код выглядит примерно вот так:

public static class RegExSplitter extends Splitter
{
    private final Pattern regex;
    private final int[] groupTypes;
    private final boolean merge;

public RegExSplitter(String regex, int[] groupTypes, boolean merge)
    {
        this.regex = Pattern.compile(regex);
        this.groupTypes = groupTypes;
        this.merge = merge;
    }

public List/**/ split(String value)
    {
        ElemMergeHelper helper = new ElemMergeHelper(value, merge);
        Matcher matcher = regex.matcher(value);
        for (int i = 0, len = len(value); i < len; i = matcher.end())
        {
            if (!matcher.find(i) || matcher.start() > i || matcher.end() <= i)
            {
                helper.add(NONE, i, len);
                break;
            }

for (int j = matcher.groupCount(); j > 0; j--)
            {
                if (matcher.end(j) <= i) continue                helper.add( ( ... )

Reply

lerm_ru November 12 2008, 21:55:19 UTC
Т.е. для примера:
void f()
{
/*
'Hello'
*/
}

Содержимое комментария также будет подсвечено как строка?

Reply

unv November 13 2008, 23:28:31 UTC
Тут ты меня подловил - '.' действительно не матчит переводы строк :)
Исправил на '[\s\S]'.

Reply


(The comment has been removed)

unv May 10 2009, 21:29:24 UTC
Спасибо :)

Reply


Leave a comment

Up