2017-08-09 114 views
1

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

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

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

字符串3:错列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+(?= @)|(?<[email protected])\d+   0,6  6   no matches 

 expected results:   0,6  6   0,6,12 

这样的IM接近,但没有雪茄。思考?

Double Edit:寻找前面没有#的数字,也没有()之间的数字。忽略@和x,他们可能会或可能不会在那里。

+0

你的要求是不明确的。请以口头方式制定。编辑了 –

+0

。我认为这清除了? – Cereston

+0

起初我带着'\ d +: - |',但你的编辑没有明确出来(<#?!)(*([“] [#X] \ d)?!?)。 –

回答

0

你似乎在寻找

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

regex demo

详细

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

注意,如果你的字符串总是平衡非嵌套的括号,你可能有(123)#x1后,您可能还需要添加[^()]*\)到先行

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

避免匹配括号内的数字。

another .NET demo