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

本文关键字:字符串 获取 正则表达式 | 更新日期: 2023-09-27 18:19:25

我有一个字符串,比如:

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。所以我想要一些通用的正则表达式。

对于这种情况,有任何有效的正则表达式吗?

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

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

正则表达式将匹配"Brief",然后是"Exercise"或"Problem"(?:使组不捕获),然后是一个空格,然后是1个或多个数字,再是"-",再是一个或多个子数字,然后是空格。

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

您可以使用regex.Replace直接转换为,但在开始时您将''n得到一个必须剥离的。

--编辑---

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

var regex=new Regex(@"Brief (?:Exercise|Problem) 1-'[1-5]?'d's");

此正则表达式将在"简短练习1-"中匹配,后跟一个数字和可选的第二个数字:

@"Brief Exercise 1-'d'd?"
<小时>

更新:

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

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

为什么不用简单的方法呢?我的意思是,如果常规部分是"简短练习#-#",用一些拆分字符替换它,然后拆分得到的字符串以获得您想要的内容。

如果你不这样做,你将永远不得不照顾特殊情况。

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