У меня две струны
<EM>is <i>love</i></EM>,<PARTITION />
и
<EM>is <i>love</i>,<PARTITION />
Я хочу, чтобы регулярное выражение полностью соответствовало второй строке, но не совпадало с первой. Пожалуйста помоги.
Примечание: все может измениться, кроме тегов EM и PARTITION.
да, вы можете иметь все переменные, кроме тегов EM и PARTITION





Не думаю, что вы задаете правильный вопрос. Это регулярное выражение полностью соответствует второй строке, а не первой:
/^<EM>is <i>love</i>,<PARTITION />$/
Но очевидно, что вы хотите сопоставить класс строк, а не только вторую строку ... верно? Определите класс строк, которым вы хотите сопоставить, и вы сможете быть на 1 шаг ближе к получению нужного регулярного выражения.
ну, извините, я имел в виду, что если строка запускается во второй строке, она соответствует ей и ничего не соответствует, если запускается в первой строке
^<EM>(?:(?<!</EM>).)*<PARTITION />$
работает. Но это зависит от целевого языка, например, JavaScript не поддерживает утверждения поиска ...
Более простое решение - использовать ^<EM>.*<PARTITION />$ и после этого просто проверить, нет ли </EM> в строке: я считаю, что RE мощные и обязательные, но я не пытаюсь делать все в одном выражении ... :-)
Если вы хотите полностью сопоставить строку, если она не содержит определенной подстроки, используйте регулярное выражение для сопоставления подстроки и верните всю строку, если регулярное выражение не совпадает. Вы не сказали, какой язык используете, но пометили свой вопрос с помощью .NET, поэтому здесь на C#:
if (Regex.IsMatch(subjectString, "</EM>")) {
return null;
} else {
return subjectString;
}
Поскольку это всего лишь немного буквального текста, вам даже не нужно использовать регулярное выражение:
if (subjectString.Contains("</EM>")) {
return null;
} else {
return subjectString;
}
В ситуации, когда все, что вы могли бы использовать, это регулярное выражение, попробуйте следующее:
\A((?!</EM>).)*\Z
Решение только для регулярных выражений будет намного менее эффективным, чем приведенные выше примеры кода.
К счастью, пройдя через все это и проведя много исследований по этому поводу, я нашел правильный regexx .......... вот для всех вас ... спасибо всем, кто помог
<EM>\w*\s*\W*\S*[^\(</EM>)]<PARTITION[ ]/>
захватывает вторую строку, но оставляет первую .... единственная проблема, с которой я столкнулся, заключалась в отрицании комбинации </EM>, которую я сделал с обратной косой чертой перед группой, это сводит на нет всю строку, а не берет символы по отдельности ....
Это не сработает, поскольку «[^ \ (</EM>)]» описывает класс символов, а не только «</EM>», как предполагалось.
Уточнение: какие части являются переменными? Могу ли я иметь что-нибудь, кроме "is love", можно ли <b> и <a href ..? Это слишком расплывчато.