Регулярное выражение Строка Опустить Вопрос - PullRequest
0 голосов
/ 19 декабря 2009

Я пытаюсь разобрать AS3 с использованием регулярных выражений. Я не могу понять, как пропустить совпадения, которые находятся внутри строковых цитат. Мне нужно соответствовать test в имени переменной testString , но не test это между цитатами. Я не хочу сопоставлять что-либо, что является частью содержимого любой строки.

var testString:String = "This is a test String";

Ответы [ 4 ]

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

Патрик поделился некоторыми хорошими замечаниями по поводу экранированных кавычек и строк в одинарных кавычках, но это еще хуже: а как насчет комментариев? Комментарии могут содержать кавычки (двойные или одинарные), а строковые литералы могут содержать элементы, похожие на разделители комментариев. И не забывайте сами регулярные выражения: литералы регулярных выражений могут содержать любые из этих вещей, и регулярные выражения также могут быть записаны в виде строковых литералов для использования с конструктором RegExp.

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

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

Вы можете иметь такой код, но помните, что в as3 строка может быть "rfwerfwer" или 'sfsrfwervwer' или "fvsfv\"sdfvsdfv" или 'sfvsdfv\'fvsfvsdfv'. Использование только регулярного выражения будет трудным для вас.

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

так что вы будете иметь в первой группе var s:String= и в третьей группе, если существует строка без кавычки This is a test String.

в as3

var s:String='var testString:String = "This is a test String";';
var re:RegExp=/([^"]+)("([^"]+)")?/;
var o:Array=re.exec(s);
if (o){
 trace(o[1])
}
1 голос
/ 19 декабря 2009

регулярное выражение, совпадающее со строками в с-подобных языках (с экранированием от обратной косой черты), выглядит следующим образом

"(\\\\.|[^"])*"

в основном: "соответствует кавычка, затем любое число (escape-последовательность или не кавычка), затем кавычка".

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

при этом регулярные выражения не являются подходящим инструментом для синтаксического анализа языков программирования. Рассмотрим синтаксический анализатор: yacc, lemon или аналогичный.

1 голос
/ 19 декабря 2009
^[^"]*test

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

method("string",test);

если это так, вам понадобится что-то более сложное, например

^[^"]*(?:"[^"]*")*[^"]*test

, который (будем надеяться) будет соответствовать любому числу (0 или более) пар кавычек, а затем протестировать.

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