如何在C#中使用正则表达式提取两个特殊字符之间的字符串

时间:2011-09-20 10:24:13

标签: c# regex

我对正则表达式完全不熟悉。我需要实现的是,我有一个包含以下字符串的字符串变量,例如

“我的名字是#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#(即包括#字符)。但拥有它有助于我的其他逻辑而不是没有它。

7 个答案:

答案 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);
        }
}

Demo here

我不知道您的应用程序是什么,但我必须说这不是一个非常强大的数据传输方法。在那里开始获得一些额外的#,这一切都出错了。例如,名字中包含#的人!

但是,如果您可以保证您将始终使用此格式的字符串,那么这确实有效。

正则表达式#(.+?)#

的说明

首先#匹配#

(开始群组。在代码中的.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
}