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

Regex pattern to match numbers in certain conditions

第一次发帖,格式不对请见谅。不是真正的程序员,我在 C# 中使用 Revit 和 AutoCAD APi。需要注意的是,由于 Revit API 有点乱,所以相同的代码可能会在不同的 API 中产生不同的结果。所以我有三个基本的字符串模式,我想根据它们的前缀和后缀 return 某些数字。它们可能被其他文本包围,而不是我显示的文本,字符串中的实际数字和位置可能会有所不同。

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

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

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

我使用的代码:

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

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

我测试过的模式及其 returns:

                                 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

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

双重编辑:查找不以# 开头,也不在() 之间的数字。忽略@和x,它们可能存在也可能不存在。

您似乎在寻找

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

regex demo

详情

  • (?<!#) - 如果在当前位置
  • 的左侧紧邻 #,则匹配失败的负后视
  • \d+ - 1 个或多个数字(或 [0-9]+ 仅匹配 ASCII 数字)
  • (?!.*(?:['-]|[#x]\d)) - 一旦有除换行符 (.*) 以外的任何 0+ 个字符后跟 '-#/x 紧跟当前位置右侧的数字。

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

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

以避免匹配括号内的数字。

参见 another .NET demo