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

Tra*_*vis 1 regex

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

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.

ken*_*ytm 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
]
Run Code Online (Sandbox Code Playgroud)

因此它匹配任何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]
Run Code Online (Sandbox Code Playgroud)