首次发帖,请原谅格式化。不是真正的程序员,我使用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,它们可能存在也可能不存在。
答案 0 :(得分:0)
你似乎在寻找
(?<!#)\d+(?!.*(?:['-]|[#x]\d))
请参阅regex demo
<强>详情
(?<!#)
- 如果当前位置左侧有#
,则会导致匹配失败的负面反馈\d+
- 一个或多个数字(或[0-9]+
仅匹配ASCII数字)(?!.*(?:['-]|[#x]\d))
- 除了换行符(.*
)之后有任何0 +字符后跟'
,-
或{{ 1}} / #
后跟紧靠当前位置右侧的数字。请注意,如果您的字符串始终具有平衡的非嵌套括号,并且您可能在x
或(123)
之后有#
个子字符串,则可能还需要添加{{1}进入前瞻
x1
避免括号内的数字匹配。