C# 作用于点的正则表达式

C# 作用于点的正则表达式,c#,regex,string,C#,Regex,String,我有一个正则表达式: string[] values = Regex .Matches(mystring4, @"([\w-[\d]][\w\s-[\d]]+)|([0-9]+)") .OfType<Match>() .Select(match => match.Value.Trim()) .ToArray(); string[]value=Regex .Matches(mystring4,@“([\w-[\d][\w\s-[\d]]+)|([0-9]+)”

我有一个正则表达式:

string[] values = Regex
  .Matches(mystring4, @"([\w-[\d]][\w\s-[\d]]+)|([0-9]+)")
  .OfType<Match>()
  .Select(match => match.Value.Trim())
  .ToArray(); 
string[]value=Regex
.Matches(mystring4,@“([\w-[\d][\w\s-[\d]]+)|([0-9]+)”)
第()类
.Select(match=>match.Value.Trim())
.ToArray();
此正则表达式将此字符串转换为: 我的有限公司(52100000/58447000)”

对于这些字符串:

我的有限公司-52100000-58447000

这也适用于非英语字符


但是有一个问题,当我有这个字符串时:MY.LIMITED.COMPANY.,它也会拆分它。我不想这样。我不想让正则表达式处理点。我怎么做呢?谢谢。

你可以在模式中的每个
\w
之后添加点,我还建议删除不必要的
:

string[]value=Regex
.Matches(“MY.LIMITED.COMPANY.(52100000/58447000)”,@“[\w.-[\d]][\w.[s-[\d]]+|[0-9]+”)
第()类
.Select(match=>match.Value.Trim())
.ToArray();
foreach(值中的var s)
控制台。写入线(s);

模式

  • [\w.-[\d]]
    -一个Unicode字母或下划线(
    [\w-[\d]]
    )或一个点(
  • [\w.\s-[\d]+
    -1个或多个字符(由于末尾有
    +
    量词),这些字符可以是Unicode字母或下划线、
    或空格(
    \s
  • |
    -或
  • [0-9]+
    -一个或多个仅ASCII数字

您可以在模式中的每个
\w
之后添加点,我还建议删除不必要的

string[]value=Regex
.Matches(“MY.LIMITED.COMPANY.(52100000/58447000)”,@“[\w.-[\d]][\w.[s-[\d]]+|[0-9]+”)
第()类
.Select(match=>match.Value.Trim())
.ToArray();
foreach(值中的var s)
控制台。写入线(s);

模式

  • [\w.-[\d]]
    -一个Unicode字母或下划线(
    [\w-[\d]]
    )或一个点(
  • [\w.\s-[\d]+
    -1个或多个字符(由于末尾有
    +
    量词),这些字符可以是Unicode字母或下划线、
    或空格(
    \s
  • |
    -或
  • [0-9]+
    -一个或多个仅ASCII数字

我会简化表达式。如果前面的名称包含数字怎么办?并不是说我的解决方案没有完全模仿原始表达式。它将允许名称部分包含数字

让我们从头开始:

  • 要匹配单词,您只需要一系列单词字符:

    \w+

    这将匹配任何字母数字字符,包括下划线(
    \uu

  • 考虑到您希望单词以点结尾的可能性,您可以添加它并使其可选(一个或零个匹配项):

    \w+\

    注意转义,使其成为实际字符,而不是字符类“任意字符”

  • 为了匹配下面的另一个潜在单词,我们现在只需复制此匹配,在前面添加一个空格,并再次使用
    *
    量词将其设置为可选:

    \w+\.?(?:\w+\.?)*

    如果您没有看到以
    开头的组:
    是一个不匹配的组。本质上,这与普通组类似,但不会在结果中保存匹配的组

  • 就这样。此模式将按预期分割演示字符串。当然,可能还有其他可能的字符未被此模式覆盖

为了测试正则表达式(并学习它们),我建议您使用以下工具

它有一个输入掩码,允许您提供您的模式和目标字符串。在右侧,它将首先向您解释模式(看看它是否确实是您想要的)下面将显示所有匹配的组。请记住,它实际上使用了一些不同的正则表达式的味道,但是对于这样简单的模式,这并不重要。(我不属于那个站点,只是认为它真的有用。)< /P>
另一种选择是,直接使用C#的正则表达式解析器,您也可以尝试这种方法。这种方法的工作原理类似,但不包括任何解释,这对于刚开始使用的人来说可能不太理想。

我会简化表达式。如果前面的名称包含数字怎么办?不是说我的解决方案没有完全模仿原始格式inal表达式。它将允许在名称部分使用数字

让我们从头开始:

  • 要匹配单词,您只需要一系列单词字符:

    \w+

    这将匹配任何字母数字字符,包括下划线(
    \uu

  • 考虑到您希望单词以点结尾的可能性,您可以添加它并使其可选(一个或零个匹配项):

    \w+\

    注意转义,使其成为实际字符,而不是字符类“任意字符”

  • 为了匹配下面的另一个潜在单词,我们现在只需复制此匹配,在前面添加一个空格,并再次使用
    *
    量词将其设置为可选:

    \w+\.?(?:\w+\.?)*

    如果您没有看到以
    开头的组:
    是一个不匹配的组。本质上,这与普通组类似,但不会在结果中保存匹配的组

  • 就这样。此模式将按预期分割演示字符串。当然,可能还有其他可能的字符未被此模式覆盖

为了测试正则表达式(并学习它们),我建议您使用以下工具

它有一个输入掩码,允许您提供您的模式和目标字符串。在右侧,它将首先向您解释模式(以查看是否正确)
string[] values = Regex
      .Matches("MY. LIMITED. COMPANY. (52100000 / 58447000)", @"[\w.-[\d]][\w.\s-[\d]]+|[0-9]+")
      .OfType<Match>()
      .Select(match => match.Value.Trim())
      .ToArray(); 
foreach (var s in values)
    Console.WriteLine(s);