首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中使用正则表达式从字符串中提取包含可选特殊字符的代码

在C#中使用正则表达式从字符串中提取包含可选特殊字符的代码
EN

Stack Overflow用户
提问于 2018-10-19 02:24:35
回答 1查看 121关注 0票数 7

我正在努力从字符串中提取报头和2或3位ISO 639代码。

有效字符串的一般格式为:

header + <special char> + <2 or 3 digit code> + (<special char>forced)

最后一节<special character>forced是可选的,可能存在,也可能不存在,但如果存在,则forced必须在前面加上特殊字符(如._-),才能被视为有效字符串。

要提取的标题和语言代码(eng)的有效字符串示例如下:

name.eng
name-eng
name(eng)
name(fri)_eng
name(fri)(eng)
name.eng.forced
name(eng).forced
name.(eng).forced
name.fri.eng.forced
name(fri).eng.forced
name.(fri).eng_forced
name-fri-eng.forced
name_(fri)_eng.forced
name(fri)_eng.forced
name(friday)_eng_forced
name(fri)(eng).forced

这里要检查的是,如果语言代码后面有一个),那么它之前一定有一个(。这并不重要,但如果正则表达式可以检查它就更好了。

无效字符串的示例如下:

nameeng
nameeng.forced
name.eng).forced
name(fri)eng.forced
name(friday).engforced
name(fri)(eng)forced

我想要检查的是:

(.*)([._\-(])([a-z][a-z][a-z]|[a-z][a-z])((?<=\(...)\))?(.forced)?

我还试图让非关键回看在语言代码之前检查(,如果它在代码之后有)的话。这也不是关键问题,但也不是我面临的核心问题。

问题是,对于一些有效的名称,头文件(以及相应的语言代码)是不正确的,因为我认为表达式太贪婪了(我使用的是C#,没有办法关闭所有操作数的贪婪)。我尝试了从右到左的选项,但在重新排列表达式后似乎也不起作用。

在C#中,是否可以通过正则表达式实现我所需要的功能?

EN

回答 1

Stack Overflow用户

发布于 2018-10-19 03:36:57

我发现你关于nameeng是无效的假设说明了什么是头的定义缺乏清晰度。以下内容将适用于成功条件。注意:使用IgnorePatternWhiteSpace允许在如下所示的模式中使用多行。

^
(?<Header>\w+)
[.\-\(\)_]*
(?<Code1>\w+)
[.\-\(\)_]*
(?<Code2>\w*)
[.\-\(\)_]*
(?<IsForced>forced)?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52880315

复制
相关文章

相似问题

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