C#正则表达式:查找占位符作为子字符串

10

我有以下字符串。

"hello [#NAME#]. nice to meet you. I heard about you via [#SOURCE#]."

在上述文本中,我有两个占位符。分别为NAME和SOURCE。

我想使用正则表达式提取这些子字符串。

请问该使用什么正则表达式模式来查找这些占位符的列表。

我尝试过:

string pattern = @"\[#(\w+)#\]";

结果

hello  
NAME 
. nice to meet you. I heard about you via  
SOURCE 
.
我只需要的是什么
NAME
SOURCE

样例代码

string tex = "hello [#NAME#]. nice to meet you. I heard about you via [#SOURCE#]."; 

    string pattern = @"\[#(\w+)#\]";

    var sp = Regex.Split(tex, pattern);

    sp.Dump();
3个回答

8

您的正则表达式工作正常。这就是Regex.Split()应该表现出来的方式(请参见文档)。如果您所说的确实是您想要的,您可以使用类似以下的内容:

var matches = from Match match in Regex.Matches(text, pattern)
              select match.Groups[1].Value;

另一方面,如果您想使用某些规则(例如使用 Dictionary<string, string>)替换占位符,那么可以执行以下操作:

Regex.Replace(text, pattern, m => substitutions[m.Groups[1].Value]);

如果这个占位符包含空格,比如 [#FIRST NAME#],那么模式会是什么? - Mohsan
为什么在简单的字符串查找/替换中要使用正则表达式? - jb.
@jb,因为可能会有数十个可能的占位符,或者您甚至可能不知道所有占位符。 - svick
1
@Mohsan,尝试使用\[#([^#]+)#\] - svick

1

尝试使用这个正则表达式:

\[#([A-Z]+)#\]

-1
^hello (.*?). nice to meet you. I heard about you via (.*?).$

非常简单,() 表示你想捕获括号内的内容,.*? 是一个“非贪婪”捕获(尽可能少地捕获字符)。. 表示任何字符。

上述示例的演示

除非你的占位符总是使用 [# 前缀和 #] 后缀,否则请参阅其他用户的帖子。


但是正则表达式不应该依赖于字符串。如果他想要本地化它呢? - svick
@svick:我认为OP使用[#tag#]作为在字符串模板中表示内容出现位置的一种方式(字符串格式本身保持不变,但这些位置的内容会被更改[例如日志文件])。 - Brad Christie
嗯,你可能是对的。我不确定那是否是 OP 想要的,所以如果可以的话,我现在会撤销我的踩票。 - svick
@svick:不用担心。我认为这篇文章有点不太清晰,而且感觉像是初学者写的,所以我选择了最简单的路线。;-) - Brad Christie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接