2016-08-10 41 views
3

我有一个电子邮件正文。它包含几行文字。我需要提取一个字符串的第一个出现的是:正则表达式来匹配包含至少3个破折号/连字符的字符串

  1. 来自特定文本
  2. 后至少包含3个短线

虚线串的形状是未知的。它可以包含任意数量的,即: AA3A-123-NNN-d或字母和数字12-000-12455-AS

例如:

Lorem存有悲坐阿梅德,consectetur adipiscing ELIT。 Donec imperdiet porta libero ac acddddiet。

南enim nisl:aliquam UT feugiat简历

具体的文字后,我需要搜索: Etiam rhoncus AAFA-12X-DDDD-12 metus risus 更多的文字:富

目标语言是C#。

我试过做类似([A-Za-z0-9]{5}-[A-Za-z0-9]{4}-[A-Za-z0-9]{3}-[A-Za-z0-9]{5})但正如你可以在这里看到的,我需要设置字符串的形状并不总是已知的。

+0

那么如果他们在你的正则表达式中包含一个可能的字符范围(在每个短划线之前),你可以将{5}更改为{1,5},以获得1到5个 – Fivestar

回答

4

您可以使用一个懒惰的量词与[\s\S]

(?:Specific\ text\ after\ which\ I\ need\ to\ search:) 
[\s\S]+?\K 
(\b\w+-\w+-\w+-\w+\b) 

\b是一个单词边界,\K删除一切从左边比赛。
参见a demo on regex101.com

+1

你也可以用'(?s)'代替'[\ s \ S]' – rock321987

+0

非常感谢,很好。如果字符串只有3个破折号,但是如果更多,例如:AA-B12-C333-D,它与第三个破折号后的部分不匹配 – Ashton

+1

@Ashton在最后加上'\ S *'如'\ b \ w + - \ w + - \ w + - \ w + \ b \ S *' – rock321987

0

如果您的表达式包含未知数量的字母和数字,则最好的做法是为正则表达式指定一个范围。我在你的例子中看到一个块最多有5个字符,而最少有一个是1个字符。

因此,像这样将捕获它,

([A-Za-z0-9]{1,5}-[A-Za-z0-9]{1,5}-[A-Za-z0-9]{1,5}-[A-Za-z0-9]{1,5}) 
+0

,感谢Fivestar。 Jan的解决方案更接近我所需要的。我感谢您的帮助 ! :) – Ashton

+0

@Ashton没有问题!这个答案好多了,我是一个相当懒惰的正则表达式,我刚编辑你的哈哈。祝你好运前进! – Fivestar

0

我会用类似(?:[a-zA-Z0-9]+-){3,}[a-zA-Z0-9]+的东西去。这将做什么是匹配3个或更多的字母数字字母组合后跟一个没有。

Try it yourself on Regex101

+0

谢谢Sebastian,我认为这也是朝着正确的方向发展,但Jan和rock321987的建议更接近。感谢你的帮助! – Ashton

相关问题