我需要解析以下字符串格式:
property1 value1
property2 value2
property3 val.ue3
其中左侧单词是属性,后面的单词是其值。
该值应在(\n
,\r
,)处进行裁剪。
我使用以下代码:
Regex reg = new Regex(string.Format("{0}\\s\\w+", propertyName));
string Val = reg.Match(str).Value;
但它有一些问题,我很难尝试解决它们:
.
,则会修剪其中的字符串(例如,对于property3
,它会返回val
,但它应返回val.ue3
)value2\r
)答案 0 :(得分:1)
我会用这个
Regex reg = new Regex(string.Format(@"{0}\s+[^\r\n]+", propertyName));
所以,如果你有一个propertyNames列表
var output=propertyNames.Select(x=>
new{
PropertyName=x,
Value=Regex.Match(input,string.Format(@"(?<={0}\s+)[^\r\n]+",x))
.Value
});
答案 1 :(得分:1)
如果值为“。”它修剪了那里的字符串(即对于property3,它返回val,但它应该返回value3)
这是因为\\w+
匹配字母数字字符和下划线,它与点字符.
不匹配。
它不会修改新行或空格中的值(有时返回 - “value2 \ r \ n”)
我可以看到这可能是怎么回事,因为正如我上面所说的那样\\w+
匹配单词字符,所以一旦它发现任何其他字符就停止匹配。
更好的正则表达式:
由于传入了属性的名称,我们只剩下一个任务,即匹配值,因为值始终以换行符\n
,回车符\r
或点结束.
然后我们可以匹配一个或多个不是捕获值的字符,如下所示:
{0}\\s*([^\\r\\n ]+)
^^
There is a space here, don't forget it
请注意,上面字符类中的后面只有一个空格
\\n
。
答案 2 :(得分:0)
将字符串放入字典并使用它似乎更合适。
var dict =
str.Split(new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(new char[] {' '}, 2))
.ToDictionary(x => x[0], x => x[1]);
string val = dict[propertyName];
答案 3 :(得分:0)
我认为你不需要正则表达式。 Split
方法应该切掉芥末:
string input =
@"property1 value1
property2 value2
property3 val.ue3";
IList<KeyValuePair<string, string>> result =
(from line in input.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
let parts = line.Split(' ')
where parts.Length > 1
select new KeyValuePair<string, string>(parts[0], parts[1])).ToList();
现在您可以使用包含键值对的结果:
property1: value1
property2: value2
property3: val.ue3
答案 4 :(得分:0)
\w
匹配任何字母,数字或下划线(有关精确定义,请参阅Word Character),但它与文字.
不匹配。为此,您可以使用字符类,例如[\w.]
。
另外,如果您正在使用其他字符串构建模式,那么您真的应该使用Regex.Escape
:
Regex reg = new Regex(string.Format(@"{0}\s[\w.]+", Regex.Escape(propertyName)));
string Val = reg.Match(str).Value;
或者可能省略string.Format
:
Regex reg = new Regex(Regex.Escape(propertyName) + @"\s[\w.]+");
string Val = reg.Match(str).Value;
请注意使用@
创建逐字string字面值。这通常使正则表达式更容易阅读,因为您不需要在模式中转义\
。