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上。
答案 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
)。