【发布时间】:2019-10-03 15:31:31
【问题描述】:
我正在尝试通过以特定字符结尾的前缀来匹配字符串。例如,如果我的字符串是"abcd" 并以# 结尾,那么任何前缀为"abcd" 的单词都应该匹配,只要它以# 结尾。以下是一些有助于说明模式的示例:
输入:"ab#" 给出true(因为"ab" 是"abcd" 的前缀并以# 结尾)。
输入:"abcd#" 给出true(因为"abcd" 是"abcd" 的前缀并以# 结尾)。
输入:"bc#" 给出false(因为"bc" 不是"abcd" 的前缀)。
输入:"ab@" 给出false(而"ab" 是"abcd" 的前缀,它不以# 结尾)。
输入:"ac#" 给出false(虽然"ac" 包含在"abcd" 中,但它不以"abcd" 的前缀开头)。
到目前为止,我已经设法提出了以下似乎工作正常的表达式:
/(abcd|abc|ab|a)#/
虽然这有效,但不是很实用,因为长度较大的词 n 会使表达式变得非常大:
/(n|n-1|n-2| ... |1)#/
有没有办法重写这个表达式,使其更具可扩展性和简洁性?
我的尝试示例(在 JS 中):
const regex = /(abcd|abc|ab|a)#/;
console.log(regex.test("abcd#")); // true
console.log(regex.test("ab#")); // true
console.log(regex.test("abc#")); // true
console.log(regex.test("abz#")); // false
console.log(regex.test("abc@")); // false
编辑:提供的一些解决方案很好,可以做我想做的事,但是,对于这个特定的问题,我正在使用纯正则表达式来匹配前缀的解决方案.
【问题讨论】:
-
你为什么不使用基本的字符串操作来检查这个而不是正则表达式?
-
@VLAZ 嗨 vlaz,你是对的 - 我可以。但是,我正在尝试将其作为正则表达式练习(我可能不应该标记 JS,我现在已经删除了标记)
-
您是在测试字符串是否包含与您的具体情况相匹配的单词,还是尝试提取该单词?我们在谈论多少个前缀?
-
@JonP 我只是测试一下是不是前缀,不用解压
-
字符串是整个“单词”还是字符串是“here is my preword# here”?