【发布时间】:2010-12-07 04:50:59
【问题描述】:
在下面的字符串中,
Jason <jason@bigcreative.com>
如何提取尖括号内的部分?
我试过<\w>,但没用。
想法?
我在 PHP 中使用 preg_match(),如果这有影响的话。
【问题讨论】:
在下面的字符串中,
Jason <jason@bigcreative.com>
如何提取尖括号内的部分?
我试过<\w>,但没用。
想法?
我在 PHP 中使用 preg_match(),如果这有影响的话。
【问题讨论】:
user502515 已经给出了你想要的正则表达式。
我想补充一下为什么您的正则表达式 <\w> 不起作用:
\w 是字符类 [a-zA-Z0-9_] 的缩写,匹配该类中的任何 one 字符。要匹配更多字符,您需要使用量词:
+ 表示一项或多项,并且* 零个或多个由于您要提取与模式匹配的字符串,您需要将模式括在括号中 (..) 以便它被捕获。
现在您最初的任务是提取 <..> 之间的字符串,正则表达式 <(\w+)> 将无法完成这项工作,因为 char 类 \w 不包括 @。
要匹配任何内容,请使用匹配任意字符串(不带换行符)的正则表达式 .*。
所以正则表达式<(.*)> 匹配并捕获尖括号之间的任何字符串。
匹配是贪心的,所以如果输入字符串是foo<foo@foo.com>, bar<bar.com>,您将提取foo@foo.com>, bar<bar.com。要解决此问题,您可以通过在 .* 末尾添加 ? 来使匹配不贪婪,从而为我们提供正确的正则表达式 <(.*?)>
【讨论】:
要在< 字符和下一个最接近的> 之间进行匹配,中间没有< 和>(注意<.*?> matches strings 如<..<...>),您可以使用
<([^<>]*)>
请参阅regex demo。
正则表达式详细信息:
< - 一个 < 字符([^<>]*) - 第 1 组:除 < 和 > 之外的任何零个或多个字符
> - > 字符。代码示例
var res = Regex.Matches(text, @"<([^<>]*)>").Cast<Match>().Select(x => x.Groups[1].Value).ToList();
const matches = [...Array.from(text.matchAll(/<([^<>]*)>/g), x => x[1])]
$res = preg_match_all('~<([^<>]*)>~', $text, $matches) ? $matches[1] : "";
res = re.findall(r'<([^<>]*)>', text)
【讨论】:
然后使用<(.*?)> 作为正则表达式。
【讨论】:
<([^>]+)>。它会更快。