Regex多重分组和匹配

umuewwlo  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(95)

我想知道我的想法是否可以用正则表达式实现。
这里是字符串:[#hall:hall] de [#immeuble:immeuble] [#hall:est équipé] d'une installation liée aux logements qu'[#hall:[甜点]
我想匹配所有具有[#hall:xxx ]或[#immeuble:xxx ](或#else:)。现在,我已经做到了:

  • 大厅
  • 已完成
  • 甜品报

用那个表情:[#hall:(.*?)]
我想知道是否有可能:

  • 大厅
  • 不可能的
  • 东部
  • 齐奏
  • 伊尔
  • 甜点

有可能有比赛信息吗?比如:

  • Hall:#Hall
  • immeuble:#immeuble
  • 测试:#hall
  • 设备:#hall
  • il:#hall
  • 甜点:#hall

谢谢你的帮助
编辑:我用这个正则表达式获得了一些关于hashtag部分的信息:

\[(?<trigger>.*?): (?<result>.*?)\]
sirbozc5

sirbozc51#

使用支持不确定长度的lookbehind(如.NET)的正则表达式引擎,很容易:

(?<=         # Assert that it's possible to match this before the current position:
  \[         # a square bracket
  (          # followed by (start capturing group 1, so we can reference this later)
    \#       # a hash character
    [^][:]+  # and one or more characters except colon or square brackets
  )          # End of capturing group
  :          # followed by a colon
  [^][]*     # and any number of characters except square brackets
)            # End of lookbehind assertion
\b           # Assert that we start the match at a word boundary
(\w+)        # Match an alphanumeric word and capture it in group 2

测试live on regex101.com
在一行中:

(?<=\[(#[^][:]+):[^][]*)\b(\w+)

在JavaScript中(在RegexBuddy的帮助下生成的代码片段:

var myregexp = /(?<=\[(#[^][:]+):[^][]*)\b(\w+)/g;
var match = myregexp.exec(subject);
while (match != null) {
    console.log("Trigger is : " + match[1] + ". Clause is : " + match[2] + '. <br/>');
    match = myregexp.exec(subject);
}
lvjbypge

lvjbypge2#

由于您似乎使用JavaScript,您可以使用2个捕获组,然后在处理组值之后获得所需的结果:

\[(#[^\][:]+):\s*([^\][]*?)\s*]

模式匹配:

  • \[匹配[
  • (捕获组1
  • #[^\][:]+匹配#,后跟除[]:以外的任何字符
  • )关闭组1
  • :\s*匹配:,后跟可选的空白字符
  • (捕获组2
  • [^\][]*?
  • )关闭组2
  • \s*匹配可选空格字符
  • ]按字面匹配

Regex demo

const regex = /\[(#[^\][:]+):\s*([^\][]*?)\s*]/g;
const str = `[#hall: hall] de [#immeuble: immeuble] [#hall: est équipé] d'une installation liée aux logements qu'[#hall: il dessert]`;

let singleWords = [];
let composed = [];

let m;
while ((m = regex.exec(str)) !== null) {
  const parts = m[2].split(/\s+/);
  singleWords = singleWords.concat(parts);
  composed = composed.concat(parts.map(v => `${v} : ${m[1]}`))
}
console.log(singleWords);
console.log(composed);

或者你可以先在一个数组中创建所有的匹配:

const s = `[#hall: hall] de [#immeuble: immeuble] [#hall: est équipé] d'une installation liée aux logements qu'[#hall: il dessert]`;
const regex = /\[(#[^\][:]+):\s*([^\][]*?)\s*]/g;
const result = Array.from(s.matchAll(regex), m => [m[1], m[2].split(/\s+/)]);
console.log(result);
liwlm1x9

liwlm1x93#

您可以使用以下内容。

#(?<trigger>hall|immeuble|est|équipé|il|dessert): (?<result>[^\]]*)

输出量

hall, hall
immeuble, immeuble
hall, est équipé
hall, il dessert

相关问题