我需要使用正则表达式匹配来自text的标记:
Hello {FullName}, I wanted to inform that your product {ProductName} is ready.
Please come to our address {Address} to get it!
如何匹配文本中的特定标记并使用正则表达式填充值?
此外,我需要以安全的方式做到这一点,并避免一切可能的问题,因为我的拼写错误或出错了,如下:
**Hello {Full{Name}, I { wanted to inform that your product {{ProductName} is ready.
Please come to our } address {Addr{Street}ess} to get it!**
P.S。
我试过了:{([^}]+)}
但如果我有例如:
{FullName}
它有效,但如果我有
它也有效{Full{Name} ...
P.S。 2:
我试过这个:{=[^{^=^}]*=}
但是我必须使用另一个角色而不仅仅是花括号...是否可以调整它以便在没有相同字符的情况下工作?
{=FullName=} - this works
{=Full{Name=} - this doesn't work
基本上,令牌位于{=Token=}
而不是{Token}
答案 0 :(得分:2)
这可能会给你一个起点。处理你想要的例外情况。
该方法遍历输入字符串,在找到OpenToken时设置'open'标志和索引。当'open'标志为真且找到CloseToken时,它会根据索引和当前位置提取子字符串。
如果ThrowOnError属性设置为true,并且在意外位置找到令牌,则会引发异常。
可以轻松修改此代码以不同方式处理意外令牌...例如完全跳过匹配,按原样添加匹配或任何您想要的。
public class CustomTokenParser
{
public char OpenToken { get; set; }
public char CloseToken { get; set; }
public bool ThrowOnError { get; set; }
public CustomTokenParser()
{
OpenToken = '{';
CloseToken = '}';
ThrowOnError = true;
}
public CustomTokenParser(char openToken, char closeToken, bool throwOnError)
{
this.OpenToken = openToken;
this.CloseToken = closeToken;
this.ThrowOnError = throwOnError;
}
public string[] Parse(string input)
{
bool open = false;
int openIndex = -1;
List<string> matches = new List<string>();
for (int i = 0; i < input.Length; i++)
{
if (!open && input[i] == OpenToken)
{
open = true;
openIndex = i;
}
else if (open && input[i] == CloseToken)
{
open = false;
string match = input.Substring(openIndex + 1, i - openIndex - 1);
matches.Add(match);
}
else if (open && input[i] == OpenToken && ThrowOnError)
throw new Exception("Open token found while match is open");
else if (!open && input[i] == CloseToken && ThrowOnError)
throw new Exception("Close token found while match is not open");
}
return matches.ToArray();
}
}
答案 1 :(得分:2)
您可以使用Balancing Group Definitions:
class Program
{
static void Main(string[] args)
{
string rawInput = @"**Hello {Full{Name}, I { wanted to
inform that your product {{ProductName} is ready.
Please come to our } address {Addr{Street}ess} to get it!**";
string pattern = "^[^{}]*" +
"(" +
"((?'Open'{)[^{}]*)+" +
"((?'Close-Open'})[^{}]*)+" +
")*" +
"(?(Open)(?!))$";
var tokens = Regex.Match(
Regex.Match(rawInput, @"{[\s\S]*}").Value,
pattern,
RegexOptions.Multiline)
.Groups["Close"]
.Captures
.Cast<Capture>()
.Where(c =>
!c.Value.Contains('{') &&
!c.Value.Contains('}'))
.ToList();
tokens.ForEach(c =>
{
Console.WriteLine(c.Value);
});
}
}
以上输出:
ProductName
Street
答案 2 :(得分:0)
我有点使用这个正则表达式90%工作:
Regex rx = new Regex("{=[^{^=^}^<^>]*=}");
但是,这会在{= =}
而非{ }
如果我有一个像{=FullName=}
这样的标记,它将替换为实际名称,但如果标记是{=Full{Name=}
,它将不会被替换,因为它是不正确的,将被忽略...这就是想法......现在,我怎样才能使用{ }
?