为什么我的正则表达式找不到任何匹配?

问题描述 投票:0回答:6

所以我有一个字符串看起来像空格和一切。

            id: 123456789,
            name: 'HappyDev',
            member: false,
            language: 0,
            isLoggedIn: 0

这是我的模式

static string pattern = @"              id: (.*),
                name: (.*),
                member: (.*),
                language: (.*),
                isLoggedIn: (.*)";

然后为了得到我的比赛我这样做..

static Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
Match m = r.Match(myString);
                if (m.Success)
                {
                    Console.WriteLine(m.Value);
                }

由于某种原因,当我编译时它返回false,即使在我可以测试我的模式的每个网站上它返回与值匹配。为什么编译时它返回false?

c# .net regex
6个回答
1
投票

问题是你有不同的空格数。要在任何情况下忽略此问题,您可以使用模式匹配多个空格:\s+。您还应该用新行的模式替换新行:[\n\r]+(请注意,这将匹配任意数量的新行)

所以你的模式变成:

static string pattern = @"\s+id: (.*),[\n\r]+\s+name: (.*),[\n\r]+\s+member: (.*),[\n\r]+\s+language: (.*),[\n\r]+\s+isLoggedIn: (.*)";

2
投票

替代解决方案:

图案

(?:: ?)(.*)(?:,)|(?:: ?)(.*)

说明:

1st Alternative (?:: ?)(.*)(?:,)
Non-capturing group (?:: ?)
  : matches the character : literally (case sensitive)
     ? matches the character   literally (case sensitive)
  ? Quantifier — Matches between zero and one times, as many times 
    as possible, giving back as needed (greedy)
  1st Capturing Group (.*)
  .* matches any character (except for line terminators)
  * Quantifier — Matches between zero and unlimited times, as many 
    times as possible, giving back as needed (greedy)
  Non-capturing group (?:,)
    , matches the character , literally (case sensitive)

2nd Alternative (?:: ?)(.*)
Non-capturing group (?:: ?)
  : matches the character : literally (case sensitive)
     ? matches the character   literally (case sensitive)
  ? Quantifier — Matches between zero and one times, as many times 
    as possible, giving back as needed (greedy)
  2nd Capturing Group (.*)
  .* matches any character (except for line terminators)
  * Quantifier — Matches between zero and unlimited times, as many 
    times as possible, giving back as needed (greedy)

你失去了指定ID等的独特性 - 但你无论如何都要依赖隐式排序的非命名捕获组 - 所以有一些地方需要改进。如果您认为它们可能会跳过params或重新排序它们,我会将命名标识符保留为模式的一部分,并将名称添加到捕获组中,以便它们与排序分离。


1
投票

有不同的方法来解决这个问题。这是我的:

string pattern = @"^id:\s*(.+),[\n|\r|\r\n]\s+name:(.+),[\n|\r|\r\n]\s+member:\s+(.+),[\n|\r|\r\n]\s+language:\s+(.+),[\n|\r|\r\n]\s+isLoggedIn:\s+(.+)$";

它将考虑介于两者之间的任何空间以及回车/换行的任何组合。


0
投票
var str = @"
    id: 123456789,
    name: 'HappyDev',
    member: false,
    language: 0,
    isLoggedIn: 0";

var matches = Regex.Matches(str, @"(?im)(?'attr'\w+):\s+(?'val'[^,]+)");
if (matches.Count == 0)
    Console.WriteLine("No matches found");
else
    matches.Cast<Match>().ToList().ForEach(m =>
        Console.WriteLine($"Match: '{m.Value}' [Attribute = {m.Groups["attr"].Value}, Value = {m.Groups["val"].Value}]"));

0
投票

我在Regex101上试过它,你的模式有间距问题(空格数不匹配)。

您可以将以下正则表达式用于空格和新行字符,因此不再需要担心多少空格:

id: (.*),\s*name: (.*),\s*member: (.*),\s*language: (.*),\s*isLoggedIn: (.*)

0
投票

谈到初始代码,检查字符串和模式中的空格量是否相等。此代码查找匹配项:

var myString = 
@"            id: 123456789,
            name: 'HappyDev',
            member: false,
            language: 0,
            isLoggedIn: 0";
string pattern = 
@"            id:.*,
            name: (.*),
            member: (.*),
            language: (.*),
            isLoggedIn: (.*)";

Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
Match m = r.Match(myString);
if (m.Success)
{
    Console.WriteLine(m.Value);
}

但是,您不应该像这样使用它,而是用(+)替换空格或使用此处提供的其他解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.