我有以下字符串
validates="required positiveInteger" label="Enter the Total Value." name="totalvalue" visibleif="hasvalue:Yes"
因此该字符串具有4个具有各自值的属性validates
,label
,name
和visibleif
我正在使用dotliquid's regular expression utility class对属性进行分组。在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);
}
}
该代码仅适用于给定的字符串,但是存在问题:
1>如果属性的顺序不同,则分组会分配错误的值。
2> name
和label
属性是必需的,但validates
和visibleif
属性不是必需的。 RegEx应该对此进行验证。
3>如果标记具有任何其他额外属性,则RegEx必须失败。
有人可以提供正确的正则表达式帮助吗?
答案 0 :(得分:1)
我怀疑这是否是我们要解决的问题。但是,在我看来,我们想要捕获属性值。在这种情况下,我们可能希望从一个简单的表达式开始,然后根据需要进行修改和更改。例如,我们可以使用:
(validates|label|name|visibleif)=("(.+?)")\s?
如果我们希望使其他字符串失败,这可能很简单,但是我不确定其他可能和所需的字符串是否可以提出任何建议。
如果不需要此表达式,可以在regex101.com中对其进行修改或更改。
jex.im可视化正则表达式:
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);
}
}
}
const regex = /(validates|label|name|visibleif)=("(.+?)")\s?/gm;
const str = `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"`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
答案 1 :(得分:0)
如果我正确理解了您的问题,对我来说,您似乎正试图通过正则表达式来实现很多目标。
我的假设是,当您在=
上分割字符串时,会得到一个键和一个值。关键是属性名称,因此在这一点上,您可以验证是否提供了label
和value
,并且只剩下label
,value
,{{1 }}和validate
。
这样,正则表达式需要简单得多-您只需要在空白处进行拆分,那么也许您根本不需要正则表达式?