使用regex c#识别文本开头和结尾的选定文本

时间:2012-03-30 10:12:42

标签: c# regex string

我的文字以(parag1 level="All")作为开始标记开头,以(/parag1)作为结束标记结尾,并且它们之间是文字。

如何在C#中使用正则表达式检查用户是否选择了带有开始标记或结束标记的文本? 我对括号使用括号:(tag)text(/tag)

示例:

(Parag1 level="All")
This is my string1. This is my string2. This is my string3.
(/Parag1) 

用户可以选择:

(Parag1 level="All")
This is my

或者

level="All")
This is my

或(这个没有开始标记)

is my string1

或者(这个带有l&#34的开始标记;)和带有()

的结束标记
l")
This is my string1. This is my string2. This is my string3.
(

我想查看:

  • 是否以"开始标记"开头?或者#34;开始标记"?的一部分 选定的文本1和2,4是可以的,但3是否。

  • 以"结束标记"结尾?或者#34;结束标记"?的一部分 选定的文字1,2,3为否,但4是可以的。


如何更改包含所有以下文字的正则表达式patern。 模式:

(<Parag)\d+\s(Level=")\w+(">)

text:

<Parag1 Level="all">

<Parag2 Level="Total">

Parag3 Level="all">

arag4 Level="all">

rag5 Level="all">

ag6 Level="all">

g7 Level="all">

8 Level="all">

 Level="all">

Level="all">

evel="all">

vel="all">

el="all">

l="all">

="all">

="all">

"all">

all">

ll">

l">

">

>

更改正则表达式c#

2 个答案:

答案 0 :(得分:1)

您必须分两步解决问题: 1)使用正则表达式查找开始/结束块,并设置多行选项。 2)使用常规String.IndexOf

查找文本

从1开始,您知道哪些是开始/结束标记的位置。

例如:

          1         2         3         4         5         6         7         8
012345678901234567890123456789012345678901234567890123456789012345678901234567890
(parag1 level="all")This is my string1. This is my...

此起始块从位置0到19.您可以从正则表达式匹配

获取此信息

如果用户提供此字符串:

level="all")This is my

此字符串的indexOf为8.并且结束位置为8 + string.Length = 19.但是您可能不需要对indexOf进行此调用,因为我认为您有开始和结束位置用户的选择。

然后你只需要检查你的块的开始/结束之间的开始位置。在这种情况下,8介于0和19之间,因此用户选择了开始标记的一部分。

将此技术应用于整个文本以及开始和结束块,然后就可以得到它。

编辑:用于查找开始/结束标记的正则表达式:

(?<pStart>\(parag(?<no>\d+).*?\))

(?<pEnd>\(/parag(?<no>\d+)\))

当您运行Regex.Matches时,您会收到一系列匹配项,您可以获得其开始/结束位置,甚至是段落编号。这些组被捕获为pStart + no(第一个正则表达式)和pEnd + no(第二个正则表达式)。

然后你可以找到paragrpah数字以及这样的开始和结束位置:

Regex re = new Regex(@"(?<pStart>\(parag(?<no>\d+).*?\))", RegexOptions.Multiline);
MatchCollection matches = re.Matches(s2);

你得到每场比赛的信息:

matches[0].Groups["pStart"]; // captured text
matches[0].Groups["pStart"].Index; // start position
matches[0].Groups["pStart"].Length; // end position, if addes to start position
matches[0].Groups["no"]; // paragraph number, which can be parsed to int

答案 1 :(得分:1)

我知道这不是您所要求的RegEx解决方案,但这里有一个开箱即用的想法。由于您的示例文本具有一些类似XML的特性,您是否考虑将()替换为<>并使用XML解析器解析它?

要使用此解决方案,您的文本除了标签之外不能有任何括号,并且您必须使用各自的转义序列替换任何非法字符。

您必须处理的另一个问题是根级别标记。如果不存在,则必须将原始字符串包装在一个中:

String data = // your string here with all opening and closed tags    
data = "<root>" + data + "</root>"  //if your data does not have a root tag, if it does, you can omit this
data = data.Replace('(', '<').Replace(')', '>');


XElement element = XElement.Parse(data);
相关问题