C# 一个截取指定前后缀的字符串的正则表达式

时间:2023-01-03 13:17:22
比如:我要在文本中截取xxx和yyy之间的字符串(注:xxx和yyy都有可能含有空格、回车换行等特殊的字符)
例如:
xxxABCyyy中,截取出ABC
这个正则表达式该怎么写?
求正则达人相助!

21 个解决方案

#1


xxx.*yyy

假设有空白,可以用\s。

#2


(?<=xxx).*?(?=yyy)

#3


引用 1 楼 caozhy 的回复:
xxx.*yyy

假设有空白,可以用\s。


我是想将ABC"原汁原味"地取出来,而不管它里面是否有空白或其他特殊字符

#4


该回复于2011-03-16 08:49:07被版主删除

#5


引用 3 楼 wonderful_abc 的回复:
引用 1 楼 caozhy 的回复:
xxx.*yyy

假设有空白,可以用\s。


我是想将ABC"原汁原味"地取出来,而不管它里面是否有空白或其他特殊字符



既然ABC里面也有可能有空白或其他特殊字符,xxx和yyy也都有可能含有空格、回车换行等特殊的字符。。


那xxx和ABC的区别在哪里。。


举个具体例子吧。。

#6


xxx和ABC没有任何区别,都是最一般的文本(可能有多行,也可能含有特殊字符)
现在整体文本TEXT,xxx以及yyy是已知的,求xxx和yyy之间的文本(代号:ABC)
假设整体文本TEXT=
123hjkl456
qwer
789  tyui
  &jsad#op
zxc@v
mnb v567cxz
要求在xxx=
"789  tyui
  &"

yyy=
"@v
mnb"
之间的文本。
即求出ABC=
"jsad#op
zxc"

不知道我这么说够不够详细清楚?

#7


(?<=xxx).*(?=yyy)

#8


提供一下javascript中的正则,c sharp我不熟。但原理应该是一样的。

var s="xxxabcyyy";

s=s.replace(/(xxx)(.*)(yyy)/gi,$2);
应该是这意思。。。哈哈!!!

#9


(?<=xxx).*(?=yyy)不行哦,我的代码如下,请各位参详:

 public static List<string> GetStringsBetween(string content, string beginString, string endString, bool ignoreCase)
        {
            List<string> list = new List<string>();
            string pattern = "(?<=" + beginString + ").*(?=" + endString + ")";
            RegexOptions ro = RegexOptions.Multiline;
            if (ignoreCase)
                ro = RegexOptions.IgnoreCase | RegexOptions.Multiline;
            MatchCollection mats = Regex.Matches(content, pattern, ro);
            foreach (Match mat in mats)
            {
                list.Add(fullpath);
            }
            return list;
        }

#10


注: xxx和yyy都有可能含有空格、回车换行等特殊的字符

--------------
意思是 xxx yyy这些字母中包含空格??
还是 之间的内容包含???

#11


xxx,yyy,以及它们之间的ABC都可能包含空格、回车换行等特殊字符。大家要把这三者当成最一般的文本看待,千万不要想当然,我觉得我已经说的再详细不过了....

#12


不好意思,我的代码中“fullpath”应该是“mat.Value”

#13


 public static List<string> GetStringsBetween(string content, string beginString, string endString, bool ignoreCase)
        {
            List<string> list = new List<string>();
            string pattern = "(?<=" + beginString + ").*(?=" + endString + ")";
            RegexOptions ro = RegexOptions.Singleline;
            if (ignoreCase)
                ro = RegexOptions.IgnoreCase | RegexOptions.Singleline;
            MatchCollection mats = Regex.Matches(content, pattern, ro);
            foreach (Match mat in mats)
            {
                list.Add(mat.Value);
            }
            return list;
        }

        static void Main()
        {
            string str = @"123hjkl456
qwer
789 tyui
  &jsad#op
zxc@v
mnb v567cxz";
            string str1 = @"123hjkl456
qwer
789 tyui
  &";
            string str2 = @"@v
mnb v567cxz";
            List<string> list = GetStringsBetween(str, str1, str2, true);
        }

我试了下, list里面的内容是
jsad#op
zxc

#14


唉, 代码里面不能插高亮,你把那几个标记去掉
public static List<string> GetStringsBetween(string content, string beginString, string endString, bool ignoreCase)
        {
            List<string> list = new List<string>();
            string pattern = "(?<=" + beginString + ").*(?=" + endString + ")";
            RegexOptions ro = RegexOptions.Singleline;
            if (ignoreCase)
                ro = RegexOptions.IgnoreCase | RegexOptions.Singleline;
            MatchCollection mats = Regex.Matches(content, pattern, ro);
            foreach (Match mat in mats)
            {
                list.Add(mat.Value);
            }
            return list;
        }

#15


happyyst:为什么要用RegexOptions.Singleline,因为允许多行匹配,不是应该用RegexOptions.Multiline么?

#16


RegexOptions.Singleline,指的是正则中的元字符.(就是点号)可以匹配换行符。。

RegexOptions.Multiline,指的是更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。。

两者没有联系。。不能看字面意思。。

#17


既然xxx,yyy是已知的那用空格替换它然后去掉前后空格不就行了。就可以不写正则了!

#18


string pattern = "(?is)(?<=" + Regex.Escape("前面")+").+?(?="+Regex.Escape("后面")+")";
Regex reg = new Regex(pattern);
reg.Match(yourStr).Value;//就是你要的 

#19


该回复于2011-03-15 20:52:19被版主删除

#20



using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "asdfxxx32\r\n1y\r\ny31yyyy";
            Regex r = new Regex(@"xxx([\w\W]*?)yyy");
            Match m = r.Match(str);
            Console.Write(m.Groups[1].ToString());
            Console.ReadLine();
        }
    }
}

加分吧

#21



           string myString = "xxxxSHENBAOyyy";

           //正声明(?=yyy)  负声明(?!xxxx)声明本身不作为匹配结果的一部分
             Regex myRegex = new Regex(@"SHENBAO(?=yyy)(?!xxxx)"); 
           Console.WriteLine(myRegex.Match(myString).Value);

           //输出结果:SHENBAO

#1


xxx.*yyy

假设有空白,可以用\s。

#2


(?<=xxx).*?(?=yyy)

#3


引用 1 楼 caozhy 的回复:
xxx.*yyy

假设有空白,可以用\s。


我是想将ABC"原汁原味"地取出来,而不管它里面是否有空白或其他特殊字符

#4


该回复于2011-03-16 08:49:07被版主删除

#5


引用 3 楼 wonderful_abc 的回复:
引用 1 楼 caozhy 的回复:
xxx.*yyy

假设有空白,可以用\s。


我是想将ABC"原汁原味"地取出来,而不管它里面是否有空白或其他特殊字符



既然ABC里面也有可能有空白或其他特殊字符,xxx和yyy也都有可能含有空格、回车换行等特殊的字符。。


那xxx和ABC的区别在哪里。。


举个具体例子吧。。

#6


xxx和ABC没有任何区别,都是最一般的文本(可能有多行,也可能含有特殊字符)
现在整体文本TEXT,xxx以及yyy是已知的,求xxx和yyy之间的文本(代号:ABC)
假设整体文本TEXT=
123hjkl456
qwer
789  tyui
  &jsad#op
zxc@v
mnb v567cxz
要求在xxx=
"789  tyui
  &"

yyy=
"@v
mnb"
之间的文本。
即求出ABC=
"jsad#op
zxc"

不知道我这么说够不够详细清楚?

#7


(?<=xxx).*(?=yyy)

#8


提供一下javascript中的正则,c sharp我不熟。但原理应该是一样的。

var s="xxxabcyyy";

s=s.replace(/(xxx)(.*)(yyy)/gi,$2);
应该是这意思。。。哈哈!!!

#9


(?<=xxx).*(?=yyy)不行哦,我的代码如下,请各位参详:

 public static List<string> GetStringsBetween(string content, string beginString, string endString, bool ignoreCase)
        {
            List<string> list = new List<string>();
            string pattern = "(?<=" + beginString + ").*(?=" + endString + ")";
            RegexOptions ro = RegexOptions.Multiline;
            if (ignoreCase)
                ro = RegexOptions.IgnoreCase | RegexOptions.Multiline;
            MatchCollection mats = Regex.Matches(content, pattern, ro);
            foreach (Match mat in mats)
            {
                list.Add(fullpath);
            }
            return list;
        }

#10


注: xxx和yyy都有可能含有空格、回车换行等特殊的字符

--------------
意思是 xxx yyy这些字母中包含空格??
还是 之间的内容包含???

#11


xxx,yyy,以及它们之间的ABC都可能包含空格、回车换行等特殊字符。大家要把这三者当成最一般的文本看待,千万不要想当然,我觉得我已经说的再详细不过了....

#12


不好意思,我的代码中“fullpath”应该是“mat.Value”

#13


 public static List<string> GetStringsBetween(string content, string beginString, string endString, bool ignoreCase)
        {
            List<string> list = new List<string>();
            string pattern = "(?<=" + beginString + ").*(?=" + endString + ")";
            RegexOptions ro = RegexOptions.Singleline;
            if (ignoreCase)
                ro = RegexOptions.IgnoreCase | RegexOptions.Singleline;
            MatchCollection mats = Regex.Matches(content, pattern, ro);
            foreach (Match mat in mats)
            {
                list.Add(mat.Value);
            }
            return list;
        }

        static void Main()
        {
            string str = @"123hjkl456
qwer
789 tyui
  &jsad#op
zxc@v
mnb v567cxz";
            string str1 = @"123hjkl456
qwer
789 tyui
  &";
            string str2 = @"@v
mnb v567cxz";
            List<string> list = GetStringsBetween(str, str1, str2, true);
        }

我试了下, list里面的内容是
jsad#op
zxc

#14


唉, 代码里面不能插高亮,你把那几个标记去掉
public static List<string> GetStringsBetween(string content, string beginString, string endString, bool ignoreCase)
        {
            List<string> list = new List<string>();
            string pattern = "(?<=" + beginString + ").*(?=" + endString + ")";
            RegexOptions ro = RegexOptions.Singleline;
            if (ignoreCase)
                ro = RegexOptions.IgnoreCase | RegexOptions.Singleline;
            MatchCollection mats = Regex.Matches(content, pattern, ro);
            foreach (Match mat in mats)
            {
                list.Add(mat.Value);
            }
            return list;
        }

#15


happyyst:为什么要用RegexOptions.Singleline,因为允许多行匹配,不是应该用RegexOptions.Multiline么?

#16


RegexOptions.Singleline,指的是正则中的元字符.(就是点号)可以匹配换行符。。

RegexOptions.Multiline,指的是更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。。

两者没有联系。。不能看字面意思。。

#17


既然xxx,yyy是已知的那用空格替换它然后去掉前后空格不就行了。就可以不写正则了!

#18


string pattern = "(?is)(?<=" + Regex.Escape("前面")+").+?(?="+Regex.Escape("后面")+")";
Regex reg = new Regex(pattern);
reg.Match(yourStr).Value;//就是你要的 

#19


该回复于2011-03-15 20:52:19被版主删除

#20



using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "asdfxxx32\r\n1y\r\ny31yyyy";
            Regex r = new Regex(@"xxx([\w\W]*?)yyy");
            Match m = r.Match(str);
            Console.Write(m.Groups[1].ToString());
            Console.ReadLine();
        }
    }
}

加分吧

#21



           string myString = "xxxxSHENBAOyyy";

           //正声明(?=yyy)  负声明(?!xxxx)声明本身不作为匹配结果的一部分
             Regex myRegex = new Regex(@"SHENBAO(?=yyy)(?!xxxx)"); 
           Console.WriteLine(myRegex.Match(myString).Value);

           //输出结果:SHENBAO