Использование предложения 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];
}