使用正则表达式从C#中的字符串中获取子字符串

时间:2012-01-05 09:52:58

标签: c# regex

我有一个字符串:

Brief Exercise 1-1 Types of Businesses Brief Exercise 1-2 Forms of Organization Brief Exercise 1-3 Business Activities.

我想使用正则表达式打破字符串,以便它可以像:

Types of Businesses
Forms of Organization
Business Activities.

请不要说我可以使用1-1,1-2和1-3来打破它,因为它会在句子之间加上“简单练习”这个词。稍后我也可以练习1-1或问题1-1。所以我想要一些普通的正则表达式。

此方案的任何有效正则表达式?

3 个答案:

答案 0 :(得分:3)

var regex=new Regex(@"Brief (?:Exercise|Problem) \d+-\d+\s");
var result=string.Join("\n",regex.Split(x).Where(a=>!string.IsNullOrEmpty(a)));

正则表达式将匹配“简短”,然后是“练习”或“问题”(?:使组不捕获),后跟一个空格,然后是1个或多个数字,然后是“ - ”,然后是一个或更多数字然后是空格。

第二个语句使用split函数将字符串拆分为数组,然后使用regex跳过所有空条目(否则拆分将在开头包含空字符串,您可以使用Skip(1)而不是{ {1}},然后最后使用string.Join将数组组合回字符串,\ n作为分隔符。

你可以使用regex.Replace直接转换为\ n但是你必须在开始时使用\ n结束时才会被剥离。

- EDIT ---

如果第一个数字始终为1且第二个数字为1-50ish,则可以使用以下正则表达式来支持0-59

Where(a=>!string.IsNullOrEmpty(a))

答案 1 :(得分:2)

此正则表达式将匹配“简要练习1-”,后跟数字和可选的第二个数字:

@"Brief Exercise 1-\d\d?"

更新

由于您可能也有“问题”,因此还需要在ExerciseProblem之间进行更改(使用非捕获括号):

@"Brief (?:Exercise|Problem) 1-\d\d?"

答案 2 :(得分:1)

为什么不以简单的方式做到这一点?我的意思是,如果常规部分是“Brief Exercise# - #”用一些拆分字符替换它,然后拆分结果字符串以获得你想要的。

如果你这样做,否则你将始终需要处理特殊情况。

string pattern = "Brief Exercise \d+-\d+";
Regex reg = new Regex(patter);
string out = regex.replace(yourstring, "|");
string results[] = out.split("|");