VB / Regex:用前后字符的条件替换字符

时间:2017-09-30 14:33:32

标签: regex vb.net

我希望将任何前面没有空格和零或任意多个数字的零转而不是零或任意数量的数字以及+或 - 成为点。

到目前为止,我已经设法用以下方法替换每个零,而不是零或任意数量的数字和+或 - 带点:

    V2   V3
2  -2.0  2.7
3   0.5  3.9
4   1.3  4.5
5   5.7  6.0
6  10.4  8.7
7   3.4  2.7
8   7.6  3.2
9   4.1  5.6
10  5.0  9.2
11  8.5 11.7
12 12.3  6.8
13 16.1 13.0
14 13.2 11.9
15  8.8  8.6
16  7.9  6.1
17  1.1  4.9
18  3.0  1.0
19  4.5  7.2
20  2.7  2.7
21  7.6  7.6

这将返回“.c ... c0 + c0-c 1.c.c”,因此最后一部分正在工作,第一部分不工作。

如果遵循此模式,我希望替换零:

Str1 = " 0 0c000c0+c0-c 10c0c"
Str2 = Regex.Replace(Str1, "(?!\s+\d*)0(?!\d*[\+\-])", ".")

示例:

<stuff><not a space followed by numbers>0<other numbers not followed by a plus or minus><more stuff>

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:3)

您需要使用 lookbehind ,而不是前瞻。使用

(?<!\s\d*)0(?!\d*[+-])
^^^^^^^^^

请参阅regex demo

在lookbehind中不需要在+之后使用\s,因为单个空格检查就足够了。

注意,不需要在字符类中转义+,如果它位于字符类的结尾处,则无需转义-

<强>详情

  • (?<!\s\d*) - 如果当前位置左侧有一个空格和0+位数,则会导致匹配失败的负面背后隐藏
  • 0 - 零
  • (?!\d*[+-]) - 如果在当前位置右侧紧跟{0}位后跟{4}}或-,则会导致匹配失败的否定前瞻。