首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用正则表达式分解字符串

用正则表达式分解字符串
EN

Stack Overflow用户
提问于 2021-11-17 00:36:45
回答 1查看 126关注 0票数 1

我有一些需要处理的示例字符串

代码语言:javascript
复制
string1 = "_Wondrous item, common (requires attunement by a wizard or cleric)_"
string2 = "_Weapon (glaive), rare (requires attunement)_"
string3 = "_Wondrous item, common_"

我想把它们分解成以下几个

代码语言:javascript
复制
group1 = {
  type: "Wonderous item"; 
  rarity: "common";
  attune: True
  class: "wizard or cleric"
  }
group2 = {
  type: "Weapon (glaive)";
  rarity: "rare";
  attune : True
  }
group3 = {
  type: "Wondrous item"
  rarity: "common"
  attune: False
  }

我目前的正则表达式是混乱的,可能效率很低,但它只分解了第一个。

代码语言:javascript
复制
regex = /_(?<type>[^:]*),\s(?<rarity>[^:]*)\s\((?<attune>[^:]+)by a(?<class>[^:]*)\)_/U

增列细节

  • 这将在逐个处理文本文档时使用。
  • 将在每个文档中执行一次。
  • 如果有人好奇的话,我会在Obsidian.MD中使用这个
  • 是的,这是为了处理从Reddit捕获的D&D魔术项目
EN

回答 1

Stack Overflow用户

发布于 2021-11-17 00:56:47

若要使用模式获取3行的所有组,请执行以下操作:

代码语言:javascript
复制
_(?<type>[^:]*?),\s+(?<rarity>[^:]*?)(?:\s+\((?<attune>[^:]+?)\s*(?:by\s+a\s+(?<class>[^:]*?))?\))?_
  • _(?<type>[^:]*?)匹配_,组类型匹配除:以外的任何字符
  • ,\s匹配,和空格字符
  • (?<rarity>[^:]*?)组的稀有性匹配除:以外的任何字符
  • (?:非捕获群
    • \s\(匹配空格char和(
    • (?<attune>[^:]+?)\s*组调谐器匹配除:以外的任何字符
    • (?:by a\s+(?<class>[^:]*?))?也可以选择匹配by a和group类,它们匹配除:之外的任何字符(非贪婪)。
    • \)匹配)

  • )?_使外部组可选,并匹配_

看一个regex演示

使用groups属性if 支持,您可以检查值并相应地更新对象。

代码语言:javascript
复制
const regex = /_(?<type>[^:]*?),\s+(?<rarity>[^:]*?)(?:\s+\((?<attune>[^:]+?)\s*(?:by\s+a\s+(?<class>[^:]*?))?\))?_/;
[
  "_Wondrous item, common (requires attunement by a wizard or cleric)_",
  "_Weapon (glaive), rare (requires attunement)_",
  "_Wondrous item, common_"

].forEach(s => {
  const m = s.match(regex);
  if (m) {
    if (m.groups.class === undefined) {
      delete m.groups.class;
    }
    m.groups.attune = m.groups.attune === undefined ? false : true;
    console.log(m.groups)
  }
});

注意到,在您的模式中,您希望阻止在否定字符类中匹配:,但是示例数据中没有:

对于第一个被否定的字符类,您可以将其更改为与逗号不匹配,而对于其他类,则排除匹配括号以获得相同的结果。

这样,并不是所有的量词都必须是不贪婪的,它可以防止一些不必要的回溯。

代码语言:javascript
复制
_(?<type>[^,]*),\s(?<rarity>[^:()]*)(?:\s\((?<attune>[^()]+?)\s*(?:by a\s+(?<class>[^()]*))?\))?_

看另一个regex演示

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

https://stackoverflow.com/questions/69997659

复制
相关文章

相似问题

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