如何用正则表达式提取单行文本中的多组文化标识与对应内容
正则提取文化标识与对应文本的解决方案
问题场景
我有一类类似键值对结构的文本:文化标识被方括号[]包裹,其后是对应文本(无明确终止符,文本可包含任意字符),示例如下:
示例1
[fr-FR] C'est la francais![en] This is english.[es-ES] Spain
示例2
[ad-sad]asd.,/?|":{{}[a!@#$%^&()**d [en]aedasd;
需要用正则表达式将文化标识提取为分组$1(去掉外层方括号),对应文本提取为分组$2,预期提取结果如下:
示例1预期结果
| Group1 $1 | Group2 $2 |
|---|---|
| fr-FR | C'est la francais! |
| en | This is english. |
| es-ES | Spain |
示例2预期结果
| Group1 $1 | Group2 $2 |
|---|---|
| ad-sad | asd.,/? |
| en | aedasd; |
我尝试过正向/反向预查、正/负断言、嵌套分组等方法均未成功,目前仅能提取分组1:(\[[\w-]+\]),也曾尝试(\[[\w-]+\])(?:(?!\[[\w-]+\]))但无效。备选方案是仅提取分组1,再通过C#代码利用匹配的index和length手动提取对应文本,现寻求正确的正则表达式解决方案。
正则表达式方案
可以通过正向预查结合非贪婪匹配实现需求,正则表达式如下:
\[([\w-]+)\](.*?)(?=\[[\w-]+\]|$)
表达式拆解
\[([\w-]+)\]:匹配方括号包裹的文化标识,将括号内的内容捕获为分组$1(自动去除外层方括号)(.*?):非贪婪模式匹配任意字符,捕获为分组$2,非贪婪特性确保不会越界匹配到下一个文化标识的内容(?=\[[\w-]+\]|$):正向预查,匹配到下一个文化标识的开头或文本结尾时停止,作为$2的终止边界
C# 代码示例
using System; using System.Text.RegularExpressions; class Program { static void Main() { string sample1 = "[fr-FR] C'est la francais![en] This is english.[es-ES] Spain"; string sample2 = "[ad-sad]asd.,/?|":{{}[a!@#$%^&()**d [en]aedasd;"; string regexPattern = @"\[([\w-]+)\](.*?)(?=\[[\w-]+\]|$)"; // 处理示例1 Console.WriteLine("=== 示例1提取结果 ==="); foreach (Match match in Regex.Matches(sample1, regexPattern)) { Console.WriteLine($"Group1: {match.Groups[1].Value}, Group2: {match.Groups[2].Value.Trim()}"); } // 处理示例2 Console.WriteLine("\n=== 示例2提取结果 ==="); foreach (Match match in Regex.Matches(sample2, regexPattern)) { Console.WriteLine($"Group1: {match.Groups[1].Value}, Group2: {match.Groups[2].Value.Trim()}"); } } }
注意事项
- 若文本包含换行符,需在
Regex.Matches中添加RegexOptions.Singleline参数,让.可以匹配换行 - 若文化标识包含
\w和-之外的字符,可调整[\w-]部分,比如允许.则改为[\w-.]
内容的提问来源于stack exchange,提问作者mihkov
相关产品推荐
相关产品推荐

