匹配字符串中的确切单词

时间:2018-09-18 00:45:45

标签: javascript delimited-text

我需要一种方法来将单词与字符串匹配,并且不会出现误报。让我举一个例子说明我的意思:

  • “ / thing”应该匹配字符串“ / a / thing”
  • “ / thing”应该匹配字符串“ / a / thing / that / is / here”
  • “ / thing”应该匹配字符串“ / a / thing_foo”

基本上,如果第一个字符串和第二个字符串中都有确切的字符,则应该匹配,但如果第二个字符串中有完整符(例如thing_foo中的下划线),则应该匹配。

现在,我正在执行此操作,该操作不起作用。

let found = b.includes(a); // true

希望我的问题很清楚。感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

男孩把它变成了经典的XY Problem

如果我不得不猜测,您想知道路径是否包含特定段。

在这种情况下,请在positive lookahead上将字符串拆分为'/',然后使用Array.prototype.includes()

const paths = ["/a/thing", "/a/thing/that/is/here", "/a/thing_foo"]
const search = '/thing'

paths.forEach(path => {
  const segments = path.split(/(?=\/)/)
  console.log('segments', segments)
  console.info(path, ':', segments.includes(search))
})

使用正向超前表达式/(?=\/)/可使我们在/上拆分字符串,同时在每个段中保留/前缀。


或者,如果您仍然热衷于使用直接的正则表达式解决方案,那么您会想要这样的东西

const paths = ["/a/thing", "/a/thing/that/is/here", "/a/thing_foo", "/a/thing-that/is/here"]
const search = '/thing'

const rx = new RegExp(search + '\\b') // note the escaped backslash

paths.forEach(path => {
  console.info(path, ':', rx.test(path))
})

请注意,如果搜索字符串后接连字符或代字号,则它们将返回假阳性,因为这些字符被视为单词边界。您将需要一个更复杂的模式,我认为第一个解决方案可以更好地处理这些情况。

答案 1 :(得分:1)

我建议使用正则表达式...

例如以下正则表达式/\/thing$/-匹配以/thing结尾的任何内容。

console.log(/\/thing$/.test('/a/thing')) // true
console.log(/\/thing$/.test('/a/thing_foo')) // false

更新:要使用变量...

var search = '/thing'
console.log(new RegExp(search + '$').test('/a/thing')) // true
console.log(new RegExp(search + '$').test('/a/thing_foo')) // false

答案 2 :(得分:0)

只需使用以下正则表达式即可

var a = "/a/thing";
var b = "/a/thing/that/is/here";
var c = "/a/thing_foo";
var pattern = new RegExp(/(:?(thing)(([^_])|$))/);
pattern.test(a) // true
pattern.test(b) // true
pattern.test(c)  // false