Использование предложения if внутри регулярного выражения - PullRequest
0 голосов
/ 13 апреля 2011

Я в настоящее время кодирую приложение 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 ]

2 голосов
/ 13 апреля 2011

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

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

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

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

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

1 голос
/ 13 апреля 2011

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

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

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

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

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

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

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

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

0 голосов
/ 13 апреля 2011

, затем попробуйте использовать метод .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];
}
0 голосов
/ 13 апреля 2011

Вот решение, которое вы можете использовать без лишних регулярных выражений, но я могу ответить только на 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, просто пофиксив скорость.Просто промойте и повторите для остальных предметов

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