我有一个类似这样的字符串
Sales
我想添加连字符,因此最终字符串变为
rawSales
.flatMap(Option(_))
.keyBy(_.id)
.reduceByKey(
(sale1, sale2) => if (sale1.timestamp > sale2.timestamp) sale1 else sale2
)
连字符应添加在第一个^((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?
之前的单词
字符串可以有多个Material TD Vandal High Supreme Signal Blue / University Red-B
我尝试了Material TD Vandal High Supreme Signal - Blue / University Red-B
尝试了几件事,但没有任何效果。
答案 0 :(得分:0)
当您说连字符应先添加/
时,问题是为什么要使用/g
修饰符? g
的意思是“全局”,它将尝试查找字符串中所有不重叠的正则表达式匹配项。您无需首先使用该修饰符。
第二,[A-Za-z]
与一个单个字符匹配。由于正则表达式引擎从左到右匹配字符串,因此,与该模式匹配的字母应后跟一个空格和一个斜杠,因此它将匹配e /
,而不是Blue /
。要匹配整个单词,您需要在+
之后添加[A-Za-z]
量词。如果您不关心字母或数字(或\w
),也可以只使用_
。甚至\S+
,一个或多个非空白也将起作用。
为使其与原始版本保持接近,我建议:
var result = string.replace(/[A-Za-z]+\s+\//, "- $&");
请参见regex demo。
详细信息
[A-Za-z]+
-1个或多个ASCII字母\s+
-超过1个空格\/
-一个/
字符(转义,因为它用在正则表达式文字中)。替换模式中的$&
是指向整个匹配项的替换后向引用,无需使用捕获组来包装整个模式。