我对正则表达式完全不熟悉。我需要实现的是,我有一个包含以下字符串的字符串变量,例如
“我的名字是#P_NAME#,我是#P_AGE#岁了”
我需要使用正则表达式(字符串数组或两个字符串变量等)提取两个字符串P_NAME和P_AGE。即字符串以#开头,以#结尾,我需要提取中间部分。
如何使用正则表达式在C#中执行此操作..?
如果我之间有一个新的行字符,我怎么能提取相同的内容呢?即,例如,
“我的名字是#P_NAME#和\ r \ n我是#P_AGE#years old”。
由于
谢谢大家......
以下为我工作...我无法将自己的答案作为答案发布,直到8小时后才能在stackoverflow中过期... :)
string str = "My Name is #P_NAME# and \r\n I am #P_AGE# years old";
MatchCollection allMatchResults = null;
var regexObj = new Regex(@"#\w*#");
allMatchResults = regexObj.Matches(str);
'allMatchResults'包含#P_NAME#和#P_AGE#(即包括#字符)。但拥有它有助于我的其他逻辑而不是没有它。
答案 0 :(得分:24)
你可以这样做
using System.Text.RegularExpressions;
using System;
public class Test
{
public static void Main(){
string s = "My name is #Dave# and I am #18# years old";
Regex r = new Regex(@"#(.+?)#");
MatchCollection mc = r.Matches(s);
Console.WriteLine("Name is " + mc[0].Groups[1].Value);
Console.WriteLine("Age is " + mc[1].Groups[1].Value);
}
}
我不知道您的应用程序是什么,但我必须说这不是一个非常强大的数据传输方法。在那里开始获得一些额外的#
,这一切都出错了。例如,名字中包含#
的人!
但是,如果您可以保证您将始终使用此格式的字符串,那么这确实有效。
正则表达式#(.+?)#
首先#
匹配#
(
开始群组。在代码中的.Groups[1]
中编入索引。 [0]
是完整匹配,例如#Dave#
而不仅仅是Dave
.+?
至少匹配一个字符。 .
是一个角色。 +
是重复的(至少是
一旦)。并且?
告诉正则表达式引擎是懒惰的 - 所以不要与#
匹配,因为我们的最终#
)
关闭小组
#
与另一个#
匹配 - 在这种情况下为'结束'
答案 1 :(得分:9)
正则表达式(如"#[^#]+#"
)将匹配哈希值,后跟一个或多个非哈希字符,后跟另一个哈希值。
有各种适用于此的替代方案,例如"#.*?#"
。
以下代码将输出#P_NAME#和#P_AGE#。
string p = "My Name is #P_NAME# and \r\n I am #P_AGE# years old";
Regex reg = new Regex("#[^#]+#");
MatchCollection matches = reg.Matches(p);
foreach (Match m in matches)
{
Console.WriteLine(m.Value);
}
答案 2 :(得分:4)
谢谢大家......
以下为我工作......
string str = "My Name is #P_NAME# and \r\n I am #P_AGE# years old";
MatchCollection allMatchResults = null;
var regexObj = new Regex(@"#\w*#");
allMatchResults = regexObj.Matches(str);
'allMatchResults'包含#P_NAME#和#P_AGE#(即包括#字符)。但让它有助于我的其他逻辑
答案 3 :(得分:2)
尝试 -
var results = new List<string>();
var subjectString = "My Name is #P_NAME# and \r\n I am #P_AGE# years old";
Regex regexObj = new Regex("#.+?#");
Match matchResults = regexObj.Match(subjectString);
while (matchResults.Success) {
results.Add(matchResults.ToString().Replace("#",""));
matchResults = matchResults.NextMatch();
}
这应该将结果写入results
数组。
答案 4 :(得分:1)
这是一个基于此的扩展方法...享受。 :)
BTW - 这不保留#个字符 - 我不想要的东西 - 你可以将RegEx更改为上面那些来获得它。
public static class StringExtensions
{
///----------------------------------------------------------------------
/// <summary>
/// Gets the matches between delimiters.
/// </summary>
/// <param name="source">The source string.</param>
/// <param name="beginDelim">The beginning string delimiter.</param>
/// <param name="endDelim">The end string delimiter.</param>
/// <returns></returns>
/// <example>
/// string beginDelim = "<span>";
/// string endDelim = "</span>";
/// string input = string.Format("My Name is {0}Lance{1} and I am {0}39{1} years old", beginDelim, endDelim);
///
/// var values = input.GetMatches(beginDelim, endDelim);
/// foreach (string value in values)
/// {
/// Console.WriteLine(value);
/// }
/// </example>
///----------------------------------------------------------------------
public static IEnumerable<string> GetMatches(this string source, string beginDelim, string endDelim)
{
Regex reg = new Regex(string.Format("(?<={0})(.+?)(?={1})", beginDelim, endDelim));
MatchCollection matches = reg.Matches(source);
return (from Match m in matches select m.Value).ToList();
}
}
答案 5 :(得分:0)
没有人提到多行情况,所以如果你有多行字符串,比如:
var testcase = @"Here is my info
#
John Doe
18 years old
#";
var regex = new Regex(@"#(.+?)#", RegexOptions.Singleline);
var match = regex.Match(testcase);
match.Groups[1].Value.Dump();
// OR
var matches = regex.Matches(testcase);
foreach (Match m in matches) m.Groups[1].Value.Dump();
/*
Output:
John Doe
18 years old
*/
您需要指定SingleLine
标志以忽略换行符并转义正斜杠。
为未来的读者发布了答案
答案 6 :(得分:-2)
尝试使用
var format = "My Name is #P_NAME# and \r\n I am #P_AGE# years old";
Regex rgxp = new Regex(@"#[(?<name>\S+)\]#", RegexOptions.Compiled);
Match m = rgxp .Match(format);
if (true == m.Success)
{
return m.Groups["name"].Value; // <-- this statement returns the value you're looking for
}