我想只使用正则表达式匹配字符串

时间:2015-08-05 07:50:17

标签: c# regex

我有一个字符串"myname 18-may 1234",我只想使用正则表达式从整个字符串"myname"

我尝试使用\b(^[a-zA-Z]*)\b正则表达式,结果给了我"myname"

但是当字符串更改为"1234 myname 18-may"时,正则表达式不会返回"myname"。请建议仅选择"myname"整个单词的正确方法。

是否也可以 - 给出字符串 " 1234 myname 18-may"格式 - 仅获取myname,而不是may

3 个答案:

答案 0 :(得分:4)

更新

根据您对其他问题的反馈判断,您可能需要

(?<!\p{L})\p{L}+(?!\p{L})

原始答案

我想出了一个更轻的正则表达式,它依赖于数据的特定性质(字符串中的几个单词,只有一个是整个单词):

\b(?<!-)\p{L}+\b

请参阅demo

甚至是more restrictive regex只在(白色)空格和字符串开头/结尾之间找到匹配项:

(?<=^|\s)\p{L}+(?=\s|$)

以下正则表达式取决于上下文:

\p{L}+(?=\s+\d{1,2}-\p{L}{3}\b)

请参阅demo

这只匹配单词myname

正则表达式意味着:

  • \p{L}+ - 匹配1个或更多Unicode字母......
  • (?=\s+\d{1,2}-\p{L}{3}\b) - 直到找到1个或多个空格(\s+)后跟1或2位数字,后跟一个连字符和3个Unicode字母(\p{L}{3}),这是一个完整的单词(\b)。这种结构是一个积极的前瞻,只检查是否可以在字符串中的当前位置之后找到某些东西,但它不会消耗&#34;文本。

由于日期可能出现在字符串之前,您可以添加更改:

\p{L}+(?=[ ]+\d{1,2}-\p{L}{3}\b)|(?<=\d{1,2}-\p{L}{3}[ ]+)\p{L}+

请参阅another demo

(?<=\d{1,2}-\p{L}{3}\s+)是一个 look-behind ,它会检查与前瞻相同的内容(差不多),但之前 {{1} }。

答案 1 :(得分:1)

使用此正则表达式进行替换:

(\s*\d+\-.{3}\s*|\s*.{3}\-\d+\s*)|(\s*\d+\s*)

你最终会得到你的名字。

Demo

答案 2 :(得分:1)

这是一个没有RegEx的解决方案

string input = "myname 18-may 1234";
string result = input.Split(' ').Where(x => x.All(y => char.IsLetter(y))).FirstOrDefault();