Что делает это регулярное выражение? - PullRequest
2 голосов
/ 25 августа 2009

Я занимаюсь преобразованием программы из Perl в Java. Я столкнулся с линией

my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);

Я не очень хорош с регулярными выражениями, но из того, что я могу сказать, это сопоставляет что-то в строке $ info {$ host} с регулярным выражением ^ \ s * (([^)] +)) \ s * $ и присвоение соответствия $ title.

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 25 августа 2009

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

Соответствует:

      (some stuff)  

Сбой:

 (some stuff

     some stuff)

   (some stuff)  asadsad
4 голосов
/ 25 августа 2009

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

Строка может начинаться и заканчиваться пробельными символами, но не другими. Однако внутри парантезов могут встречаться произвольные символы (как минимум один).

Следующие строки должны соответствовать:

 (abc)
 (()
   (ab)

Кстати, вы можете просто использовать регулярное выражение как есть в Java (после экранирования обратной косой черты), используя класс Pattern.

1 голос
/ 25 августа 2009

ОК, шаг за шагом

/ - процитировать регулярное выражение

^ - начало строки

\ s * - ноль или более символов, подобных пробелу

(- фактический (символ

(- начать захват группы

[^)] + любой из символов ^ или) +, указывающий хотя бы один

) - конец группы захвата

) и действительный) символ

\ s * ноль или более пробелов в виде символов

$ - конец строки

/ - закрыть регулярное выражение

Итак, насколько я могу понять, мы ищем строки типа "(^)" или "())" Мне кажется, что-то здесь не хватает.

0 голосов
/ 25 августа 2009
my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);

Сначала m// в контексте списка возвращает захваченные совпадения. my ($title) помещает правую часть в контекст списка. Во-вторых, $info{$host} сопоставляется со следующим шаблоном:

/^ \s* \( ( [^\)]+) \) \s* $/x

Да, использовал флаг x, чтобы я мог вставить несколько пробелов. ^\s* пропускает все начальные пробелы. Затем у нас есть экранированный паратез (поэтому группа захвата не создается. Затем у нас есть группа захвата, содержащая [^\)]. Этот класс символов можно лучше записать как [^)], поскольку правая скобка не является особенной в классе символов и означает все, кроме левой круглой скобки .

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

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