我正在尝试使用正则表达式将字符串拆分为 2 个数组,结果是这样的。
String str1 = "First Second [insideFirst] Third Forth [insideSecond] Fifth";
如何将 str1 拆分为 2 个如下所示的数组:
ary1 = ['First Second','Third Forth','Fifth'];
ary2 = ['insideFirst','insideSecond'];
这是我的解决方案
string str = "First Second [insideFirst] Third Forth [insideSecond] Fifth";
MatchCollection matches = Regex.Matches(str,@"\[.*?\]");
string[] arr = matches.Cast<Match>()
.Select(m => m.Groups[0].Value.Trim(new char[]{'[',']'}))
.ToArray();
foreach (string s in arr)
{
Console.WriteLine(s);
}
string[] arr1 = Regex.Split(str,@"\[.*?\]")
.Select(x => x.Trim())
.ToArray();
foreach (string s in arr1)
{
Console.WriteLine(s);
}
输出
insideFirst
insideSecond
First Second
Third Forth
Fifth
请尝试以下代码。它对我来说工作正常。
String str1 = "First Second [insideFirst] Third Forth [insideSecond] Fifth";
var output = String.Join(";", Regex.Matches(str1, @"\[(.+?)\]")
.Cast<Match>()
.Select(m => m.Groups[1].Value));
string[] strInsideBreacket = output.Split(';');
for (int i = 0; i < strInsideBreacket.Count(); i++)
{
str1 = str1.Replace("[", ";");
str1 = str1.Replace("]", "");
str1 = str1.Replace(strInsideBreacket[i], "");
}
string[] strRemaining = str1.Split(';');
请在调试代码时查看下面的输出屏幕截图:
这里,strInsideBreacket 是像 insideFirst 和insideSecond 这样的括号值数组,而strRemaining 是First Second、Third Forth 和Fifth 的数组
谢谢
试试这个解决方案,
String str1 = "First Second [insideFirst] Third Forth [insideSecond] Fifth";
var allWords = str1.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
var result = allWords.GroupBy(x => x.Contains("inside")).ToArray();
这个想法是,首先获取所有单词,然后将其分组。
在我看来,“user2828970”用一个例子提出了一个问题,而不是他想要解析的文字文本。在我看来,他很可能会问这个问题:
我正在尝试使用正则表达式来拆分这样的字符串。
var exampleSentence = "I had 185 birds but 20 of them flew away"; var regexSplit = Regex.Split(exampleSentence, @"\d+");
结果
regexSplit
是:I had
,birds but
,of them flew away
.但是,我还想知道导致第二个字符串与其前面的文本分开的值,以及导致第三个字符串与其前面的文本分开的值。即:我想知道
185
和20
。字符串可以是任何东西,分割的模式可以是任何东西。答案不应包含硬编码值。
好吧,这个简单的函数将执行该任务。可以优化代码以编译正则表达式,或重新组织以返回多个集合或不同的对象。但这(几乎)是我在生产代码中使用它的方式。
public static List<Tuple<string, string>> RegexSplitDetail(this string text, string pattern)
{
var splitAreas = new List<Tuple<string, string>>();
var regexResult = Regex.Matches(text, pattern);
var regexSplit = Regex.Split(text, pattern);
for (var i = 0; i < regexSplit.Length; i++)
splitAreas.Add(new Tuple<string, string>(i == 0 ? null : regexResult[i - 1].Value, regexSplit[i]));
return splitAreas;
}
...
var result = exampleSentence.RegexSplitDetail(@"\d+");
这将返回一个如下所示的集合:
{ null, "I had "}, // First value, had no value splitting it from a predecessor
{"185", " birds but "}, // Second value, split from the preceding string by "185"
{ "20", " of them flew away"} // Third value, split from the preceding string by "20"
由于这是一个 .NET 问题,除了我在其他答案中更喜欢的方法之外,您还可以通过另一种非常简单的方式捕获拆分值。然后,您只需要创建一个函数来利用您认为合适的结果。
var exampleSentence = "I had 185 birds but 20 of them flew away";
var regexSplit = Regex.Split(exampleSentence, @"(\d+)");
regexSplit 的结果是:I had
, 185
, birds but
, 20
, of them flew away
. 如您所见,拆分值存在于拆分结果中。
请注意与我的其他答案相比的细微差别。在这个正则表达式拆分中,我在整个模式周围使用了一个捕获组(\d+)
你不能这样做!!!?..你可以吗?
在拆分中使用捕获组将强制拆分结果捕获组之间的拆分值的所有捕获组。这可能会变得混乱,所以我不建议这样做。它还迫使使用您的函数的人知道他们必须将正则表达式包装在捕获组中。