我有以下字符串:
Bacon ipsum dolor amet **kevin kielbasa** pork chop picanha chuck,
t-bone **brisket corned beef fatback hamburger cow** sirloin shank prosciutto
shankle. T-bone pancetta ribeye **tongue** fatback drumstick frankfurter short
ribs burgdoggen. **Tail cupim.**
我想获得:
List<string>(){
"Bacon ipsum dolor amet ",
"**kevin kielbasa**",
" pork chop picanha chuck, t-bone ",
"**brisket corned beef fatback hamburger cow**",
" sirloin shank prosciutto shankle. T-bone pancetta ribeye ",
"**tongue**",
" fatback drumstick frankfurter short ribs burgdoggen. ",
"**Tail cupim.**"
}
方法:
完全在Regex中:
首过
Regex.Split(str, @"\*\*.*?\*\*");
"Bacon ipsum dolor amet ",
" pork chop picanha chuck, t-bone ",
" sirloin shank prosciutto shankle. T-bone pancetta ribeye ",
" fatback drumstick frankfurter short ribs burgdoggen. "
拆分将删除所有匹配项。它将每个都视为它认为我们想要的项目之间的分隔符。天哪!
第二关
Regex.Matches(str, @"\*\*.*?\*\*").Cast<Match>().Select(m => m.Value).ToList();
"**kevin kielbasa**",
"**brisket corned beef fatback hamburger cow**",
"**tongue**",
"**Tail cupim.**"
好吧,那很有意义。 Regex.Matches()
返回与正则表达式匹配的所有项目,因此我们丢失了之间的所有内容。
加上一些LINQ:
好的,让我们看看是否可以将所有文本汇总到一个列表中:
Regex.Split(str, @"\*\*");
"Bacon ipsum dolor amet ",
"kevin kielbasa",
" pork chop picanha chuck, t-bone ",
"brisket corned beef fatback hamburger cow",
" sirloin shank prosciutto shankle. T-bone pancetta ribeye ",
"tongue",
" fatback drumstick frankfurter short ribs burgdoggen. ",
"Tail cupim."
奇怪的是,这个简单的正则表达式使我们最接近正则表达式,但是我们不再知道列表中的哪些项目被**
包围。因为**
会替换每个列表项,所以我们只需要知道列表中的第一个(或第二个)项是否被**
包围。
bool firstIsMatch = "**" == new string(str.Take(2).ToArray());
然后,我们可以使用该布尔值来确定是否要在列表中每个偶数或奇数项的开头和结尾添加“ **”。
问题:
有没有办法用正则表达式完全做到这一点?如果是这样,怎么办?
尽管是“更多代码”,但第二个选项是否在性能和/或可读性方面是首选?
参考方案
您需要做的就是将正则表达式包装在捕获组中。一旦正则表达式找到要分割的匹配项,匹配文本也将被推入结果数组中。请参见Regex.Split
参考:
如果在Regex.Split
表达式中使用捕获括号,则任何捕获的文本都将包含在结果字符串数组中。例如,如果在捕获括号内的连字符上拆分字符串“ plum-pear”,则返回的数组将包含一个包含连字符的字符串元素。
以后可以使用LINQ轻松过滤出空元素:
var str = "Bacon ipsum dolor amet **kevin kielbasa** pork chop picanha chuck, t-bone **brisket corned beef fatback hamburger cow** sirloin shank prosciutto shankle. T-bone pancetta ribeye **tongue** fatback drumstick frankfurter short ribs burgdoggen. **Tail cupim.**";
var res = Regex.Split(str, @"(\*{2}.*?\*{2})", RegexOptions.Singleline) // Split and keep the captures
.Where(s=>!string.IsNullOrWhiteSpace(s)); // Remove blank elements
Console.WriteLine("\"{0}\"", string.Join("\"\n\"", res));
请参见C# demo。
还有关于模式性能的小注释:如果文本很大,由于惰性点匹配模式,您可能会遇到速度变慢的情况。将其展开为@"\*{2}[^*]*(?:\*(?!\*)[^*]*)*\*{2}"
是一个好主意,尤其是在存在少量“野生”,独立星号(定界符)的情况下。
我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…
改造正在返回一个空的响应主体 - java我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…
每个文件合并后添加换行 - python我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…
用大写字母拆分字符串,但忽略AAA Python Regex - python我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…
java split regex-字符的任意组合 - java我正在使用3个字符分割字符串:空格,破折号和逗号我想要的是能够使用这3个字符的任意组合进行拆分,例如:-,(破折号后跟逗号)或,--(逗号后加2破折号)或- , -(破折号,逗号间隔破折号)等 String address = "Sector -18B, Dwarka"; String[] addressParts = address.s…