Как мне сопоставить любой символ в нескольких строках регулярного выражения? - PullRequest
282 голосов
/ 01 октября 2008

Например, это регулярное выражение

(.*)<FooBar>

будет соответствовать:

abcde<FooBar>

Но как мне заставить его совпадать по нескольким строкам?

abcde
fghij<FooBar>

Ответы [ 21 ]

5 голосов
/ 01 октября 2008
/(.*)<FooBar>/s

s приводит к тому, что точка (.) Соответствует возврату каретки

4 голосов
/ 03 июня 2013

В регулярном выражении на основе Java вы можете использовать [\s\S]

3 голосов
/ 13 апреля 2010

Используйте RegexOptions.Singleline, он меняет значение. включить переводы строки

Regex.Replace (content, searchText, replaceText, RegexOptions.Singleline);

3 голосов
/ 02 октября 2008

Обратите внимание, что (.|\n)* может быть менее эффективным, чем (например) [\s\S]* (если регулярные выражения вашего языка поддерживают такие экранированные символы), и чем найти способ определения модификатора, который делает. также соответствуйте новым строкам. Или вы можете пойти с POSIXy альтернативами, такими как [[:space:][:^space:]]*.

2 голосов
/ 04 апреля 2012

Решение:

Используйте модификатор шаблона sU, чтобы получить желаемое совпадение в PHP.

пример:

preg_match('/(.*)/sU',$content,$match);

Источник:

http://dreamluverz.com/developers-tools/regex-match-all-including-new-line http://php.net/manual/en/reference.pcre.pattern.modifiers.php

1 голос
/ 26 марта 2009

У меня была такая же проблема, и я решил ее, вероятно, не лучшим образом, но она работает. Я заменил все разрывы строк, прежде чем я сделал свой реальный матч:

mystring= Regex.Replace(mystring, "\r\n", "")

Я манипулирую HTML, поэтому в этом случае разрывы строк не имеют для меня никакого значения.

Я попробовал все вышеизложенные предложения, но не повезло, я использую .Net 3.5 FYI

1 голос
/ 27 февраля 2019

В Javascript вы можете использовать [^] * для поиска от нуля до бесконечных символов, включая разрывы строк.

$("#find_and_replace").click(function() {
  var text = $("#textarea").val();
  search_term = new RegExp("[^]*<Foobar>", "gi");;
  replace_term = "Replacement term";
  var new_text = text.replace(search_term, replace_term);
  $("#textarea").val(new_text);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="find_and_replace">Find and replace</button>
<br>
<textarea ID="textarea">abcde
fghij&lt;Foobar&gt;</textarea>
1 голос
/ 01 октября 2008

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

В этом случае данное регулярное выражение будет соответствовать всей строке, поскольку присутствует «». В зависимости от особенностей реализации регулярного выражения, значение $ 1 (полученное из «(. *)») Будет либо «fghij», либо «abcde \ nfghij». Как уже говорили другие, некоторые реализации позволяют вам контролировать, стоит ли "." будет соответствовать новой строке, давая вам выбор.

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

0 голосов
/ 18 января 2011

Я хотел сопоставить конкретный блок if в java

   ...
   ...
   if(isTrue){
       doAction();

   }
...
...
}

Если я использую regExp

if \(isTrue(.|\n)*}

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

if \(!isTrue([^}.]|\n)*}

для исключения закрывающей скобки из совпадения с подстановочными знаками.

0 голосов
/ 01 октября 2008

в общем. не соответствует переводу строки, поэтому попробуйте ((.|\n)*)<foobar>

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