2010-12-03 7 views
2

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

полоскание, повторите.

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

Edit:.?

В частности, я использую Tcl, а под «метасимволами» я имею в виду, что есть всевозможные длинные строки, такие как «**$^{*$%\)». Я бы не хотел их избегать. Я хочу сказать, что это добавило бы тысячи символов в строку. Имеет ли Tcl regexp метасимвол метаданных буквенного текста?

+0

Можете привести пример? Не совсем ясно, что вы спрашиваете. – Robusto 2010-12-03 14:59:17

+1

В зависимости от вашего языка вы можете использовать функцию типа `Regex.escape()`, которая автоматически удалит строку. – jjnguy 2010-12-03 14:59:59

ответ

4

нормальный способ сделать это в Tcl является использование процедуры помощника, чтобы сделать вытекание, как это:

proc re_escape str { 
    # Every non-word char gets a backslash put in front 
    regsub -all {\W} $str {\\&} 
} 

set awkwardString "**$^{*$%\\)" 
regexp "simpleWord *[re_escape $awkwardString] *simpleWord" $largeString 

Где у вас есть целый символьной строки, у вас есть два других варианта:

regexp "***=$literal" $someString 
regexp "(?q)$literal" $someString 

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

-1

Я считаю, что Perl и Java поддерживают \ Q \ E escape. так

\Q.*.*()\E

..will фактически соответствует буквальному «.*.*()»

ИЛИ

хака, но вместо буквального раздела с текстом, который не нуждается в esacping и который не будет отображаться в другом месте в вашей искомой строке. Затем создайте регулярное выражение, используя этот текст без метасимвола. Например, 100-значная случайная последовательность. Затем, когда ваше регулярное выражение совпадает с определенной позицией и длиной в доработанной строке, вы можете вычислить местоположение, которое должно появиться в исходной строке и какую длину она должна быть.

0

Нет, tcl не имеет такой функции.

Если вы обеспокоены читабельностью, вы можете использовать переменные и команды для создания своего выражения. Например, вы могли бы сделать что-то вроде:

set fixed1 {.*?[]} ;# match the literal five-byte sequence .*?[] 
set fixed2 {???} ;# match the literal three byte sequence ??? 
set pattern "this.*and.*that" 

regexp "[re_escape $fixed1]$pattern[re_escape $fixed2]" 

Вы должны были бы поставить определение для re_escape, но решение должно быть довольно очевидно.

0

регулярное выражение Tcl может быть задан с помощью директивы metasyntactical q, чтобы указать, что выражение является буквальным текстом:

% set string {this string contains *emphasis* and 2+2 math?} 
% puts [regexp -inline -all -indices {*} $string] 
couldn't compile regular expression pattern: quantifier operand invalid 
% puts [regexp -inline -all -indices {(?q)*} $string] 
{21 21} {30 30} 

Это, однако, применяется ко всему выражению.

Что бы я сделал, это перебрать возвращаемые индексы, используя их в качестве аргументов для [string range], чтобы извлечь другой материал, который вы ищете.

Смежные вопросы