正则表达式不匹配重复的字母

时间:2010-08-02 18:57:27

标签: regex

myString = "THIS THING CAN KISS MY BUTT. HERE ARE MORE SSS";
myNewString = reReplace(myString, "[^0-9|^S{2}]", "|", "All");

myNewString是“|||S||||||||||||SS||||||||||||||||||||||||SSS

我想要的是“||||||||||||||||SS|||||||||||||||||||||||||||”这是我认为^S{2}会做的事情(完全排除2 S)。为什么它匹配任何S?有人能告诉我如何解决它吗? TIA。

实际目标 我正在尝试验证值列表。可接受的值将是6位数字或由SS进行的5位数字,因此123456,SS12345是有效列表。 我想要做的是将所有不是SS或数字的东西变成新的分隔符,因为我无法控制输入。 例如123456和SS12345应更改为123456 ||||| SS12345。改变后|分隔符到,结果是123456,SS12345。如果用户输入123456 PLUS SS12345最终得到123456 |||| S | SS12345 = 123456,S,SS12345无效且用户收到错误,但如果它与单个匹配则应该有效S上。

3 个答案:

答案 0 :(得分:8)

[^0-9|^S{2}]实际上意味着:

[^     # any character except
  0-9  #  0 to 9
  |    #  a vertical bar
  ^    #  a caret 
  S    #  an S            <-----
  {    #  an open brace
  2    #  a 2, and
  }    #  a close brace
]

因此匹配任何S。

由于CodeFusion不支持lookbehind或在替换中有回调,我认为只需使用REReplace就可以解决这个问题。

我不知道CF,但我会尝试类似的事情:

resultString = "";
sCount = 0
for character in myString + "$":
  if character == 'S':
    sCount += 1
  else:
    if sCount == 2:
      resultString += "SS"
    else:
      resultString += "|" * sCount
    sCount = 0
    if isdigit(character):
      resultString += character
    else:
      resultString += "|"
resultString = resultString[:-1]

答案 1 :(得分:2)

您正在使用带有[^ ....]的否定字符类,0-9|^S{2}以外的任何字符都将被替换为0-9,^{&amp; }也将存活下来。实际字符串而不是字符的负匹配将非常困难。只需将'SS {2}'替换为:(?<!S)SS(?!S),任何“SS”都难以实现。我尽力而为(?<=SS)S|S(?=SS)|(?<=S)S(?=S)|(?<!S)S(?!S)|[^S0-9],但我无法保证。

答案 2 :(得分:2)

我是否正确阅读此内容,因为除了两个连续S字符外,您想要替换所有内容?

这仅限于一次替换调用,还是可以通过多个正则表达式操作来运行?如果允许多个操作,则可以更容易地通过一个与S{3,}匹配的正则表达式运行字符串(以获取三个或更多S个字符的实例),然后通过第二个使用{{ {1}}(获取单个([^S])S([^S])个字符)。第三次运行可以与您的其他规则匹配(S)。