在某些条件下匹配数字的正则表达式模式

时间:2017-08-09 19:23:48

标签: c# regex revit-api

首次发帖,请原谅格式化。不是真正的程序员,我使用Revit和AutoCAD APi在C#中工作。需要注意的是,由于Revit API有点混乱,因此相同的代码可能会在不同的API中产生不同的结果。所以我有三个基本的字符串模式,我想根据它们的前缀和放大器返回某些数字。后缀。它们可能被我显示的其他文本所包围,并且字符串中的实际数字和位置可能会有所不同。

字符串1:(12)#4x2'-0 @ 6 EF

字符串2:(12)#4 @ 6 EF

字符串3: STAGGER 2'-0,SPCG AT 6 AT 12 SLAB

我正在使用的代码:

if (LengthAsString.IsMatch(remarkdata) == true)
{
    Regex remarklength = new Regex(@"isnertRegexPatternhere");
    if (remarklength.IsMatch(remarkdata))
    {
        remarkdata = remarklength.Replace(remarkdata, "${0}\u0022");
    }
} 

remarkdata是上面的字符串,我在每次数字匹配后添加英寸标记。

我测试的模式及其回报:

                                 String 1   String 2   String 3
    \d+(?!['-]|([(\d+)]))        0,6        4,6        0,6,12
    (?<![#])\d+                  12,2,0,6   12,6       2,9,6,12
    \d+(?= @)|(?<=@ )\d+         0,6        6          no matches
     expected results:           0,6        6          0,6,12

所以我很近,但没有雪茄。想法?

Double Edit:查找前面没有#的数字,也不是()之间的数字。忽略@和x,它们可能存在也可能不存在。

1 个答案:

答案 0 :(得分:0)

你似乎在寻找

(?<!#)\d+(?!.*(?:['-]|[#x]\d))

请参阅regex demo

<强>详情

  • (?<!#) - 如果当前位置左侧有#,则会导致匹配失败的负面反馈
  • \d+ - 一个或多个数字(或[0-9]+仅匹配ASCII数字)
  • (?!.*(?:['-]|[#x]\d)) - 除了换行符(.*)之后有任何0 +字符后跟'-或{{ 1}} / #后跟紧靠当前位置右侧的数字。

请注意,如果您的字符串始终具有平衡的非嵌套括号,并且您可能在x(123)之后有#个子字符串,则可能还需要添加{{1}进入前瞻

x1

避免括号内的数字匹配。

请参阅another .NET demo