Как исключить вхождение подстроки из строки с помощью регулярных выражений? - PullRequest
3 голосов
/ 10 июня 2011

У меня есть строка ввода в следующих двух формах.

1.

<!--XYZdfdjf., 15456, hdfv.4002-->
<!DOCTYPE

2.

<!--XYZdfdjf., 15456, hdfv.4002
<!DOCTYPE

Я хочу вернуть совпадение, еслиформа 2 встречается и не соответствует форме 1. Таким образом, в основном я хочу регулярное выражение, которое принимает произвольно все символы от <!-- до <!DOCTYPE, за исключением случаев, когда между ними имеется вхождение -->.

Я использую Pattern, Matcher и Java Regex.Требуется помощь в виде регулярного выражения, которое можно использовать с Pattern.compile ()

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 10 июня 2011
Pattern p = Pattern.compile("(?s)<!--(?:(?!-->).)*<!DOCTYPE");

(?:(?!-->).)* соответствует одному символу за раз, после , проверяя, что это не первый символ -->.

(?s) устанавливает режим DOTALL (так называемый одиночныйрежим строки), позволяя . сопоставлять символы новой строки.

Если существует возможность двух или более совпадений, и вы хотите найти их по отдельности, вы можете заменить * на не жадный*?, вот так:

"(?s)<!--(?:(?!-->).)*?<!DOCTYPE"

Например, применение этого регулярного выражения к тексту вашего вопроса найдет два совпадения, в то время как исходное регулярное выражение найдет одно, более длинное совпадение.

3 голосов
/ 10 июня 2011

Кажется, что это легко решить с помощью String.contains():

if (yourHtml.contains("-->")) {
    // exclude
} else {
    // extract the content you need
    String content = 
        yourHtml.substring("<!--".length(), yourHtml.indexOf("<!DOCTYPE"));
}

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

2 голосов
/ 10 июня 2011
\<!--([\s\S](?!--\>))*?(?=\<\!DOCTYPE)

при этом используется отрицательный прогноз для предотвращения -> и положительный прогноз, чтобы найти

1 голос
/ 10 июня 2011

Регулярное выражение может быть не лучшим ответом на вашу проблему.Вы пытались отделить первую строку от всего остального и посмотреть, содержит ли она -->?

В частности, что-то вроде:

String htmlString;
String firstLine = htmlString.split("\r?\n")[0];
if(firstLine.contains("-->"))
    ;//no match
//match
1 голос
/ 10 июня 2011

У меня нет удобной системы тестирования, поэтому я не могу дать вам регулярное выражение, но вы должны заглянуть в документацию по шаблону для чего-то под названием negative lookahead assertion.Это позволяет вам выражать правила в форме: Сопоставьте это, если за этим не следует.

Это должно помочь вам:)

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