2017-08-09 109 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