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.
在[^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)