查找相同控件分隔符之间的字符串?

时间:2016-10-22 17:10:24

标签: c# regex special-characters

我正在读取文件,需要找到一个由两个相同的非ascii值/控制分隔符封装的字符串,在本例中为“RS”

Image in Notepad++

我该怎么做呢?我需要某种形式的正则表达式吗?

4 个答案:

答案 0 :(得分:0)

使用正则表达式可以执行以下操作:

string pattern = string.Format("{0}(.*){1}",firstString,secondString);
var matches = Regex.Matches(myString, pattern);
foreach (Match match in matches)
    {
        foreach (Capture capture in match.Captures)
        {
        //Do stuff, with the current you should remove firstString and secondString from the capture.Value
        }
    }

之后使用Regex.match查找与之前构建的模式匹配的字符串 记得要逃避正则表达式的所有特殊字符。

答案 1 :(得分:0)

您可以使用Regex.Matches,我在此示例中使用X作为分隔符:

var fileContents = "Xsomething1X Xsomething2X Xsomething3X";

var results = Regex.Matches(fileContents, @"(X).*?(\1)");

您可以循环results以使用匹配项执行任何操作。

正则表达式中的\1表示"引用第一个组"。我已将X放在()之间,因此它将成为第1组,我使用\1表示此地方的匹配应与该组完全相同1。

答案 2 :(得分:0)

RS代表Record Separator,它的值为30(或十六进制为0x1E)。您可以使用此正则表达式:

\x1E([\w\s]*?)\x1E

匹配RS,然后匹配任何字母,数字或空格,然后匹配RS。 ?是为了使正则表达式匹配尽可能少的字符,以防后来有更多的RS字符。

如果您不想匹配数字,可以使用[a-zA-Z\s]代替[\w\s]

示例:

string fileContents = "Something \u001Eyour string\u001E more things \u001Eanother text\u001E end.";
MatchCollection matches = Regex.Matches(fileContents, @"\x1E([\w\s]*?)\x1E");

if (matches.Count == 0)
    return; // Not found, display an error message and exit.

foreach (Match match in matches)
{
    if (match.Groups.Count > 1)
        Console.WriteLine(match.Groups[1].Value);
}

如您所见,您获得了Match的集合,每个match.Value将包含完整的匹配字符串,包括分隔符。 match.Groups将包含所有匹配的组,第一个是整个匹配的字符串(默认为默认值),然后是每个组(括号之间的那些组)。在这种情况下,你的正则表达式中只有一个,所以你只需要该列表中的第二个。

答案 3 :(得分:0)

您不需要正则表达式。

  1. 阅读文件内容(File.ReadAllText)。

  2. 拆分分隔符(String.Split)。

  3. 如果您知道字符串只出现一次,请取第二个数组元素(result[1])。否则,请采取其他所有条目(result.Where((x, i) => i % 2 == 1))。