regex 如何查找只包含一个特殊字符的字符串?

7kqas0il  于 2023-02-14  发布在  其他
关注(0)|答案(3)|浏览(196)

我有一个字符串,例如:

const str = "he**o *ow ar* you ***** ***?"

我只想匹配那些只包含星号的字符串,所以这个例子的结果是:

const output = ["*****", "***"]

我以为会是这样的:

const regex = /\b\*+\b/g

但是我认为单词边界不起作用,因为 * 不是单词字符。
Regex绝对不是我的强项,所以这里有人能帮我吗?

fcg9iug3

fcg9iug31#

您可以使用

(?<=\W)\*+(?=\W)

说明:(?=\W)(?=\W)的行为类似于\b(是零长度Assert,这意味着它们匹配位置但不匹配特定字符。与\b匹配单词char和非单词char之间的边界的方式相同,(?=\W)告诉引擎匹配前面没有字符的位置,(?=\W)告诉引擎匹配后面没有字符的位置。因为您希望整个单词都是“*”,所以匹配前后没有任何单词char的一组 * 是有意义的。
工作示例如下:https://regex101.com/r/TQftpX/1

在javascript中的用法:

const str = "he**o *ow ar* you ***** ***?";
const output = [... str.matchAll(/(?<=\W)\*+(?=\W)/g)].map(match => match[0]);
//  output === [ "*****", "***" ]
2izufjch

2izufjch2#

查看输入结束语或非单词:

(?<=^|\W)\*+(?=$|\W)

参见live demo
当全星号单词在任意一端时,这也将匹配,例如

**** foo ***
wpx232ag

wpx232ag3#

对于此特定示例数据,另一个替代使用\b的选项可能是使用\B

\B\*+\B

参见regex101 demo
如果你不想在a**********a中得到部分匹配,你可以使用lookaroundsAssertnot *到左边和右边:

\B(?<!\*)\*+\B(?!\*)

参见另一个regex101 demo

相关问题