Шаблон регулярного выражения должен соответствовать только первому вхождению и не быть «жадным» - PullRequest
2 голосов
/ 30 мая 2019

Я нахожусь в тупике на одном паттерне, который продолжает возвращать все совпадения, кроме первого (это «жадный») мой шаблон: ISS / (? \ w \ S *) Где текст имеет два совпадения:

ISS / 2018-03-02
ISS / 2005-03-09

Я хочу, чтобы регулярное выражение C # возвращало первое совпадение "2018-03-02"

    private static readonly Regex tagIssueDateRegex = new Regex(
        @"ISS\/(?<issue>\w+\S*)",
        RegexOptions.Singleline);

Ответы [ 3 ]

3 голосов
/ 30 мая 2019

нежадным

Для не жадных, мы просто добавили бы флаг s:

ISS\/(\d{4}-\d{2}-\d{2})

ДЕМО для не жадных

Тест

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"ISS\/(\d{4}-\d{2}-\d{2})";
        string input = @"ISS/2018-03-02 
ISS/2005-03-09
ISS/2018-03-02 
ISS/2005-03-09
ISS/2018-03-02 
ISS/2005-03-09";
        RegexOptions options = RegexOptions.Singleline;

        Match m = Regex.Match(input, pattern, options);
        Console.WriteLine("'{0}' found at index {1}", m.Value, m.Index);
    }
}

жадный

Я предполагаю, что мы хотим вернуть только первый экземпляр ISS, за которым следует дата, для которой мы начнем с выражения:

ISS\/(\d{4}-\d{2}-\d{2})

тогда мы добавим одно из следующих выражений:

[\s\S]*
[\w\W]*
[\d\D]*
[\s\S].*
[\w\W].*
[\d\D].*

чтобы провести все символы и новые строки до конца нашей строки, и у нас будет:

ISS\/(\d{4}-\d{2}-\d{2})[\s\S]*

если я правильно понял вопрос.

Мы можем добавить или уменьшить наши границы, если это необходимо.

Test

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"ISS\/(\d{4}-\d{2}-\d{2})[\s\S]*";
        string input = @"ISS/2018-03-02 
ISS/2005-03-09
ISS/2018-03-02 
ISS/2005-03-09
ISS/2018-03-02 
ISS/2005-03-09";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

ДЕМО для жадных

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

2 голосов
/ 30 мая 2019

Обратите внимание, что в вашем шаблоне \w+\S* является очень широким соответствием для даты, например части.

Вы можете использовать свой шаблон и использовать Соответствие , чтобы получить первое вхождение.

string pattern = @"ISS\/(?<issue>\w\S*)";
string input = @"ISS/2018-03-02
ISS/2005-03-09";
RegexOptions options = RegexOptions.Multiline;
var res = Regex.Match(input, pattern);
Console.WriteLine(res.Value); 

Результат:

ISS/2018-03-02

C # Demo

Если вы хотите более конкретное соответствие для формата даты, который вы можете использовать:

\bISS/(?<issue>\d{4}-\d{2}-\d{2})\b

См. Демонстрационную версию regex

2 голосов
/ 30 мая 2019

Используйте этот шаблон:

^ISS\/(?<issue>\w+\S*)

Если перед первым «МКС» может быть текст, используйте этот:

^.*?ISS\/(?<issue>\w+\S*)

^ означает «начало строки»", .*? означает" любой символ от 0 до n раз, как можно меньше.

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