【问题标题】:How to match begin or end of a line using C#'s Regex?如何使用 C# 的正则表达式匹配行的开头或结尾?
【发布时间】:2011-07-06 12:05:25
【问题描述】:

我正在尝试匹配这个表达式:

^COMA1TA2000,.*$

用这段文字:

# Qualquer linha iniciada por # será ignorada
# Caracteres que não podem serem usados na nomenclatura das copiadoras ou modelos.
# & < > " '
COMA1TA2000,ta-2000,hd,COMB1
#COMA2TA2000,ta-2000,hd,COMB2
#COMA3TA2000,ta-2000,hd,COMB3

我可以使用 Notepad++ 做到这一点,但我不能使用 C# Regex 类。

content = sr.ReadToEnd();
string pattern =  "^COMA1TA2000,.*$";
if(Regex.IsMatch(content, pattern))
System.Windows.Forms.MessageBox.Show("Test");

我错过了什么?

【问题讨论】:

  • 明确一点,您的IsMatch 行返回false?

标签: c# .net regex


【解决方案1】:

你可以使用RegexOptions.Multiline,像这样:

Regex.IsMatch(content, pattern, RegexOptions.Multiline)

文档:http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

如果未设置 RegexOptions.Multiline^$ 将匹配 string 的开头和结尾*,而不是预期的 line

【讨论】:

    【解决方案2】:

    或者在正则表达式(?m)中设置多行选项:(?m)^COMA1TA2000,.*$

    【讨论】:

    • 在我只能访问 .net 正则表达式的环境中,而不是创建和运行它们的代码 - 我认为我运气不好,因为似乎需要设置多行选项对于我想要做的事情。这完全有效!学到了一些新的和漂亮的东西。 :)
    【解决方案3】:

    使用File.ReadLines 代替ReadToEnd 方法并在每一行上应用正则表达式。

    您现在正在做的是将整个文本作为文本块读取,而 MultiLine 选项有时会破坏内容(因为在不同的操作系统中有不同的 CRLF 字符,诸如此类)。

    我的建议是这样的:

    string[] lines = File.ReadAllLines("path to your text file");
    Regex regex = new Regex("^pattern$");
    foreach (string line in lines)
    {
        Match match = regex.Match(line.Trim())
        if (match.Successful)
        {
             // have your match here.
        }
    }
    

    【讨论】:

    • 这是个好主意,我会在下一个项目中记住这一点。但是对于这个问题,第一个答案是正确的。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 2015-04-27
    • 2012-12-12
    • 1970-01-01
    • 2020-02-06
    • 2014-07-17
    相关资源
    最近更新 更多