Использование предложения if внутри регулярного выражения

Я в настоящее время кодирую приложение Windows.net, используя vb.net.

Я пытаюсь передать регулярное выражение Regex.Match извлечь определенные тексты из статьи. Как мне написать условие if в регулярном выражении? Я прочитал этот шпаргалку регулярного выражения, согласно которой условие может быть указано с помощью <?()>, но не было приведено ни одного примера.

Например, у меня есть следующий текст:

"Mary have banana. Mary have apple. Mary have NO pear."

Я могу использовать следующее выражение, чтобы вынуть (1) banana, (2) appleи (3) NO pear:

mary have (.+?\.)+?

Но если я хочу извлечь только те фрукты, которые mary имеет, а именно (1) banana и (2) appleЯ думаю, мне нужно добавить условие в (.+?\.)+? часть, верно? Как мне перечислить условие в регулярном выражении?

Пожалуйста, помогите, спасибо!

4 ответа

Решение

Попробуйте это здесь:

Mary\shave\s(?!NO)(\S*)

Вы можете попробовать это онлайн здесь: http://regexr.com/?2thid

Первая часть - это отрицательное предпросмотр, это означает, что это регулярное выражение не будет соответствовать, если есть "Мэри имеет НЕТ". В противном случае он поместит слово после "Мэри" в первую группу захвата.

Здесь, в Perlretut (предполагается, что то же самое для.net) объясняется условная часть, но я думаю, что мое решение проще.

Другие предложили решения для вашего конкретного случая, поэтому я просто сосредоточусь на "предложении if", упомянутом в заголовке.

.NET поддерживает условные выражения, используя следующий шаблон.

(?(bob)[a-z]+|[0-9]+)

Регулярное выражение сначала попытается сопоставить текстовое выражение (часть во внутренних скобках), если оно совпадает, тогда выражение over all попытается сопоставить, используя подвыражение перед конвейером ([a-z]+) в противном случае он будет пытаться сопоставить, используя под-выражение после канала ([0-9]+).

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

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

(?(?<!\s)[a-z]+|[0-9]+)

Конечно, забег вперед с нулевой шириной является избыточным, поскольку выражение "test" всегда считается с нулевой шириной.

Вот решение, которое вы можете использовать без лишних регулярных выражений, но я могу ответить только на C#

    string sentence = "Mary have banana Mary have apple Mary have NO pear";
    if (sentence.Contains("banana"))
    {
        string x= sentence.Remove(sentence.IndexOf("banana"),"banana".Length);
    }

Не смейся, XD просто спидфикс. Просто промыть и повторить для остальных предметов

Затем попробуйте использовать .Split() метод. раскол, вероятно, будет выглядеть примерно так

sentence = "Mary have banana Mary have apple Mary have NO pear"; 
string[] brokenUp = sentence.Split(
      new String[] 
      { 
          "first fruit as string variable", 
          "second fruit as string variable", 
          "third fruit as string variable" 
      }, 
      StringSplitOptions.None
);
string newSentence = null;
for (int i = 0; i < brokenUp.Length; i++)
{
    newSentence += brokenUp[i];
}
Другие вопросы по тегам