从字符串中提取5个字符后的文本,且去除最后一个斜杠。

3

我有几个字符串:

some-text-123123#####abcdefg/
some-STRING-413123#####qwer123t/
some-STRING-413123#####456zxcv/

我想收到:

abcdefg
qwer123t
456zxcv

我尝试过正则表达式:

/[^#####]*[^\/]/

但是这并没有起作用...


你能解释一下“after 5 characters”的意思吗? - Munsif Ali
2
尝试:/#####([^\/]+)/ - anubhava
尽可能避免使用正则表达式。那么str.split("#####")[1].slice(0, -1)怎么样? - code
3个回答

6
为了得到最后一个字符"/"前面五个"#"字符所代表的内容,您可以使用以下代码:
/#####(.*)\//

并选择第一组。

演示:

const regex = /#####(.*)\//;

console.log('some-text-123123#####abcdefg/'.match(regex)[1]);
console.log('some-STRING-413123#####qwer123t/'.match(regex)[1]);
console.log('some-STRING-413123#####456zxcv/'.match(regex)[1]);


1
你还可以使用正向预查和反向预查,以便能够在不匹配 #####/ 的情况下仅匹配它们之间的字符串;即 /(?<=#####).*(?=\/)/ - Lemondoge
2
@Lemondoge 虽然这可能会减慢比赛的速度。 - code

2

假设:

  • 字符串样本中所需的部分将始终为:
    • 在5个#之后开始
    • 在单个/之前结束

建议: /(?<=#{5})\w*(?=\/)/

因此,(?<=#{5})是一个向后断言,它将检查任何匹配字符串是否紧接着具有提供的断言(在这种情况下,5个#)。

(?=\/)是一个向前断言,它将检查匹配字符串段之前的内容,以查看它是否与提供的断言匹配(在这种情况下,一个单独的/)。

正则表达式实际返回的文本匹配是\w*,由字符类和量词组成。字符类\w匹配任何字母数字字符([A-Za-z0-9_])。*量词匹配前面的项零次或多次。

成功匹配:

  • 'some-text-123123#####abcdefg/'
  • 'some-STRING-413123#####qwer123t/'
  • 'some-STRING-413123#####456zxcv/'

我强烈建议深入学习正则表达式,因为它是一个非常强大的工具。

MDN作为大部分Web开发内容的资源,是正则表达式的绝佳资源。从我的答案中可以学到的所有内容都可以在MDN的正则表达式语法速查表上学习到。

此外,交互式工具在组合复杂的正则表达式时非常有用。Regex 101通常是我使用的工具,但是可以从谷歌搜索中找到许多类似的在线Web工具。


1
你的模式无法使用,因为你使用了 否定字符类 [^
模式[^#####]*[^\/]可以写成[^#]*[^\/],可以匹配除了 # 以外的可选字符,并且再匹配一个单独的字符,除了 /
以下是可以产生相同匹配的其他模式的一些示例。
至少有 5 个前导 `#` 字符,然后匹配一个单词字符组和字符串末尾的 `/`,使用锚定符号 `$`,如果不是这种情况,则省略锚定符号。
#####(\w+)\/$

正则表达式演示

如果前面应该有一个除 # 以外的字符

[^#]#####(\w+)\/$
(?<!#)#####(\w+)\/$

正则表达式演示

使用否定字符类匹配至少 5 个 # 字符,且中间没有 #/

#####([^#\/]+)\/

或者使用先行断言和后行断言:
 (?<=(?<!#)#####)[^#\/]+(?=\/)

正则表达式演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接