正则表达式+在模式中包含一个空格

4

我正在尝试编写一个匹配以下内容的模式:"3Z 5Z"。其中,数字可能会变化,但Z是不变的。我遇到的问题是如何包含空格...目前我的模式如下:

 pattern = @"\b*Z\s*Z\b";

'

*'代表匹配Z前面的任意数字,但是在其中包含空格时似乎无法正常匹配。例如,我可以成功地使用以下模式来匹配没有空格的相同内容(即3Z5Z)。

'
pattern = @"\b*Z*Z\b";

我正在使用.NET 4.0(C#)编写此程序。非常感谢您的帮助!
编辑:此模式是较大字符串的一部分,例如: 3Z 10Z lock 425"
3个回答

5

试试这个:

pattern = @"\b\d+Z\s+\d+Z\b";

解释:

"
\b    # Assert position at a word boundary
\d    # Match a single digit 0..9
   +     # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
Z     # Match the character “Z” literally
\s    # Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
   +     # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\d    # Match a single digit 0..9
   +     # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
Z     # Match the character “Z” literally
\b    # Assert position at a word boundary
"

顺便说一下:
\b*

应该抛出异常。\b是单词锚点。无法对其进行量化。

嗨,FailedDev - 感谢您的建议,但它仍然没有返回匹配项...也许您可以发现一个错误 - 现在我有:pattern = @"\b\d+Z\s+\d+Z\b"; (编辑 - 删除了星号但仍然无效) - keynesiancross
@keynesiancross \d+* 这里应该抛出一个异常。去掉加号后面的星号。 - FailedDev
抱歉 - 我已经删除了那个星号(请参见上面的编辑),但仍然无法提供匹配... 另外,我已经在原帖中添加了编辑。 - keynesiancross
结果证明我只是个白痴,在方法运行之前设置了断点。你上面的代码非常好用。非常感谢。 - keynesiancross

1
除了其他帖子,我还会添加字符串的开头和结尾字符。
patter = "^\d+Z\s\d+Z$"

真的,但 OP 使用了单词锚定,所以这个字符串可能是一个更大的字符串的一部分。 - FailedDev

1

试试这段代码。

using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      string txt="3Z 5Z";

      string re1="(\\d+)";  // Integer Number 1
      string re2="(Z)"; // Any Single Character 1
      string re3="( )"; // Any Single Character 2
      string re4="(\\d+)";  // Integer Number 2
      string re5="(Z)"; // Any Single Character 3

      Regex r = new Regex(re1+re2+re3+re4+re5,RegexOptions.IgnoreCase|RegexOptions.Singleline);
      Match m = r.Match(txt);
      if (m.Success)
      {
            String int1=m.Groups[1].ToString();
            String c1=m.Groups[2].ToString();
            String c2=m.Groups[3].ToString();
            String int2=m.Groups[4].ToString();
            String c3=m.Groups[5].ToString();
            Console.Write("("+int1.ToString()+")"+"("+c1.ToString()+")"+"("+c2.ToString()+")"+"("+int2.ToString()+")"+"("+c3.ToString()+")"+"\n");
      }
      Console.ReadLine();
    }
  }
}

它匹配Z和任何整数。 - Shankar Narayana Damodaran
FYI,“Singleline”选项在这里没有效果。它所做的就是允许点匹配任何字符,包括换行符,而此正则表达式中没有换行符。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接