簡體   English   中英

如何僅匹配第一次出現的字母數字字符,前面是非字母數字字符?

[英]How to match only the first occurrence of an alphanumeric character, preceded by a non-alphanumeric character?

我將如何構造一個正則表達式來生成前面是非字母數字字符的字母數字字符的索引?

例子:

  1. (特別版)--> 應該只匹配 'S' 並產生索引 1
  2. 特別版 --> 根本不應該匹配
  3. "{(Special Edition)}" --> 應該匹配 'S' 並產生索引 3

我知道 JavaScript 可以像這樣提供匹配的索引:

const index = string.match(/regular_expression/)?.index || 0;

我無法弄清楚如何構建一個符合我所描述的表達式。

如果這部分(S應該產生索引 1,我認為這部分{(S應該產生索引 2 而不是 3。

您可以匹配兩個字符並使用捕獲組捕獲第二個字符,然后加 1 以獲取索引。

如果支持,您可以使用后向斷言,然后您不需要額外添加 1。

作為一種模式,您可以匹配:

[^a-zA-Z\d\s]([a-zA-Z\d])

模式匹配:

  • [^a-zA-Z\d\s]匹配不是字母數字或空白字符的單個字符
  • ([a-zA-Z\d])捕獲組 1 中的單個字母數字字符

查看正則表達式演示

 const regex = /[^a-zA-Z\d\s]([a-zA-Z\d])/; [ "(Special Edition)", "Special Edition", "{(Special Edition)}", ].forEach(s => { const m = s.match(regex); if (m) { console.log(`${s} --> ${m[1]} index: ${m.index + 1}`); } })

使用積極的lookbehind和String.prototype.search方法:

'(Special Edition)'.search(/(?<=[^A-Za-z0-9\s])[A-Za-z0-9]/); // 1

'Special Edition'.search(/(?<=[^A-Za-z0-9\s])[A-Za-z0-9]/); // -1

'{(Special Edition)}'.search(/(?<=[^A-Za-z0-9\s])[A-Za-z0-9]/); // 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM