我有一个字符串"myname 18-may 1234"
,我只想使用正则表达式从整个字符串"myname"
。
我尝试使用\b(^[a-zA-Z]*)\b
正则表达式,结果给了我"myname"
。
但是当字符串更改为"1234 myname 18-may"
时,正则表达式不会返回"myname"
。请建议仅选择"myname"
整个单词的正确方法。
是否也可以 - 给出字符串
" 1234 myname 18-may"格式 - 仅获取myname
,而不是may
?
答案 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)
答案 2 :(得分:1)
这是一个没有RegEx的解决方案
string input = "myname 18-may 1234";
string result = input.Split(' ').Where(x => x.All(y => char.IsLetter(y))).FirstOrDefault();