首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pegjs正则表达式匹配单词,直到找到单词集合中的单词为止

pegjs正则表达式匹配单词,直到找到单词集合中的单词为止
EN

Stack Overflow用户
提问于 2016-01-06 05:09:22
回答 2查看 565关注 0票数 0

我正在为一个项目使用pegjs解析器生成器,并且我在创建一个语法时遇到了困难,该语法应该匹配所有单词,直到它不应该匹配的单词集合。例如,在字符串"the door is start“中,我希望能够匹配所有单词,直到is,告诉pegjs解析器从单词is开始解析。我希望解析器中断的单词集合是"is“、"has”和" of“。

当前语法规则如下:

代码语言:javascript
运行
复制
subject "sub" = 
s:[a-zA-Z ]+ { return s.join("").trim()}

我如何创建一个前视来阻止解析器在单词上包含我的集合?

代码语言:javascript
运行
复制
(!of|is|has)
EN

回答 2

Stack Overflow用户

发布于 2021-12-07 18:53:27

我知道这个问题是5年前提出的,但我只是在清理pegjs标签中未回答的问题。

这似乎是可行的,您只需要用您的进一步处理规则替换postfix即可。

代码语言:javascript
运行
复制
subject "sub" =  prefix:prefix breakWord:breakWord postfix:postfix "\n"? {
  return { prefix: prefix, breakWord, postfix }
}

prefix = $(!breakWord .)* { return text().trim() }
postfix = [^\n]* { return text().trim() }

breakWord
  = "is"
  / "has"
  / "of"

它通过输入"the door is which“生成以下代码:

代码语言:javascript
运行
复制
{ prefix: "the door", breakWord: "is", postfix: "yellow" }

注意几件事:

  • form (!breakWord .)有点慢;它会针对前缀中的每个字符,提前检查以确保当前输入不是以breakWord备用集合中的任何单词开始。
  • 如果有以常用字符集开头的断开词(例如," is“和”is‘t“),请确保较长的单词在breakWord规则中排在第一位。
  • 当前的D12规则假定换行符可能会终止输入。
票数 0
EN

Stack Overflow用户

发布于 2016-01-06 07:41:24

这将会起作用

代码语言:javascript
运行
复制
.+(?=\s+(of|is|has))

它匹配一个或多个任意字符(换行符除外),直到遇到前面有空格的' of‘、'is’或'has‘(通过正前视)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34621277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档