C# 使用正则表达式对字符串进行分组
我有下面的字符串C# 使用正则表达式对字符串进行分组,c#,.net,regex,dotliquid,C#,.net,Regex,Dotliquid,我有下面的字符串 validates="required positiveInteger" label="Enter the Total Value." name="totalvalue" visibleif="hasvalue:Yes" 因此,该字符串有4个属性验证,标签,名称和可视如果 我正在使用分组属性。在initialize方法中,markup参数的值下面是上面的字符串 public class TextBox : DotLiquid.Tag { //R.B and R.Q a
validates="required positiveInteger" label="Enter the Total Value." name="totalvalue" visibleif="hasvalue:Yes"
因此,该字符串有4个属性验证
,标签
,名称
和可视如果
我正在使用分组属性。在initialize
方法中,markup
参数的值下面是上面的字符串
public class TextBox : DotLiquid.Tag
{
//R.B and R.Q are dotliquid's utility method
private static readonly Regex Syntax = R.B(R.Q(@"(?<validation>{0}+)(\s(?<label>{0}+))?(\s(?<name>{0}+))?(\s(?<onlyif>{0}+))?"), Liquid.QuotedFragment);
private string[] _validations;
private string[] _label;
private string[] _name;
private string[] _onlyif;
public override void Initialize(string tagName, string markup, List<string> tokens)
{
var syntaxMatch = Syntax.Match(markup);
if (syntaxMatch.Success)
{
_validations = syntaxMatch.Groups["validation"].Value.Split("=").TrimQuotes().ToArray();
_label = syntaxMatch.Groups["label"].Value.Split("=").TrimQuotes().ToArray();
_name = syntaxMatch.Groups["name"].Value.Split("=").TrimQuotes().ToArray();
_onlyif = syntaxMatch.Groups["onlyif"].Value.Split("=").TrimQuotes().ToArray();
}
else
{
throw new SyntaxException("Invalid syntax");
}
base.Initialize(tagName, markup, tokens);
}
public override void Render(Context context, TextWriter result)
{
base.Render(context, result);
}
}
公共类文本框:dotluide.Tag
{
//R.B和R.Q是dotliquid的实用方法
私有静态只读正则表达式语法=R.B(R.Q(@“({0}+)(\s(?{0}+)))(\s(?{0}+))))(\s(?{0}+)))))(\s(?{0}+)))),Liquid.QuotedFragment;
私有字符串[]_验证;
私有字符串[]_标签;
私有字符串[]_名称;
私有字符串[]仅适用于;
公共覆盖无效初始化(字符串标记名、字符串标记、列表标记)
{
var syntaxMatch=Syntax.Match(标记);
if(syntaxMatch.Success)
{
_validations=syntaxMatch.Groups[“validation”].Value.Split(“=”).TrimQuotes().ToArray();
_label=syntaxMatch.Groups[“label”].Value.Split(“=”).TrimQuotes().ToArray();
_name=syntaxMatch.Groups[“name”].Value.Split(“=”).TrimQuotes().ToArray();
_onlyif=syntaxMatch.Groups[“onlyif”].Value.Split(“=”).TrimQuotes().ToArray();
}
其他的
{
抛出新的SyntaxException(“无效语法”);
}
初始化(标记名、标记、标记);
}
公共覆盖无效呈现(上下文、TextWriter结果)
{
base.Render(上下文、结果);
}
}
代码仅使用给定字符串,但存在以下问题:1> 如果属性的顺序不同,则分组会被分配错误的值 2>
名称
和标签
属性是必需的,但验证
和可见(如果不需要属性)。正则表达式应该验证这一点
3> 如果标记具有任何其他额外属性,则正则表达式必须失败
有人能帮我处理正确的正则表达式吗?如果我正确理解了您的问题,对我来说,您似乎试图用正则表达式实现太多的目标
我的假设是,当您在=
上拆分字符串时,您会得到一个键和一个值。关键是属性名称,因此此时您可以验证是否提供了标签
和值
,并且只提供了标签
、值
、验证
和可视如果
这样,正则表达式就需要简单得多——您只需要在空格上拆分,所以可能根本不需要正则表达式?我怀疑这是否是我们想要解决的问题。然而,在我看来,我们似乎想要捕获属性值。如果是这样的话,我们可能希望从一个简单的表达式开始,然后根据需要进行修改和更改。例如,我们可以使用:
(validates|label|name|visibleif)=("(.+?)")\s?
如果我们希望其他字符串失败,这可能很简单,但是我不太确定是否有其他可能的和需要的字符串可以提供任何建议
正则表达式
如果不需要此表达式,可以在中对其进行修改或更改
正则表达式电路
可视化正则表达式:
示例测试
演示
const regex=/(验证| label | name | visibleif)=(“(.+?)”)\s?/gm;
const str=`validates=“required positiveInteger”label=“输入总值。”name=“totalvalue”visibleif=“hasvalue:Yes”
validates=“required positiveInteger”label=“输入总值。”name=“totalvalue”visibleif=“hasvalue:Yes”fail\u attribute=“Undesired”`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
log(`Found match,group${groupIndex}:${match}`);
});
}
如果我按照您的代码建议循环,它就会起作用。但是,如果i groupSyntax.Match(markup)
则不会返回正确的组
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(validates|label|name|visibleif)=(""(.+?)"")\s?";
string input = @"validates=""required positiveInteger"" label=""Enter the Total Value."" name=""totalvalue"" visibleif=""hasvalue:Yes""
validates=""required positiveInteger"" label=""Enter the Total Value."" name=""totalvalue"" visibleif=""hasvalue:Yes"" fail_attribute=""Undesired""";
RegexOptions options = RegexOptions.Multiline;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}