Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 要分析制表符分隔文件的正则表达式_.net_Regex_Tab Delimited - Fatal编程技术网

.net 要分析制表符分隔文件的正则表达式

.net 要分析制表符分隔文件的正则表达式,.net,regex,tab-delimited,.net,Regex,Tab Delimited,我正试图让这个正则表达式用于捕获制表符分隔行上的字段。这似乎适用于所有情况,但行以两个选项卡开头时除外: ^\t|"(?<field>[^"]+|\t(?=\t))"|(?<field>[^\t]+|\t(?=\t))|\t$ 仅捕获5个字段,省略了第一个“空格”(制表符)正则表达式可能不是此工作的最佳工具。我建议您使用该类,该类用于解析具有分隔字段或固定长度字段的文件。如果您使用C#编写代码,它驻留在Microsoft.VisualBasic程序集中这一事实有点令人讨

我正试图让这个正则表达式用于捕获制表符分隔行上的字段。这似乎适用于所有情况,但行以两个选项卡开头时除外:

^\t|"(?<field>[^"]+|\t(?=\t))"|(?<field>[^\t]+|\t(?=\t))|\t$

仅捕获5个字段,省略了第一个“空格”(制表符)

正则表达式可能不是此工作的最佳工具。我建议您使用该类,该类用于解析具有分隔字段或固定长度字段的文件。如果您使用C#编写代码,它驻留在Microsoft.VisualBasic程序集中这一事实有点令人讨厌,但这并不妨碍您使用它…

正则表达式可能不是执行此任务的最佳工具。我建议您使用该类,该类用于解析具有分隔字段或固定长度字段的文件。如果您使用C#编写代码,它驻留在Microsoft.VisualBasic程序集中这一事实有点令人讨厌,但这并不妨碍您使用它…

同意Regex不是适合此工作的工具

当托马斯把这个链接发布到框架中的一个漂亮的小宝石时,我正在清理这个代码。我使用此方法解析可能包含引号字符串和转义字符的分隔文本。它可能不是世界上最优化的,但在我看来,它可读性很好,而且它完成了任务

/// <summary>
/// Breaks a string into tokens using a delimeter and specified text qualifier and escape sequence.
/// </summary>
/// <param name="line">The string to tokenize.</param>
/// <param name="delimeter">The delimeter between tokens, such as a comma.</param>
/// <param name="textQualifier">The text qualifier which enables the delimeter to be embedded in a single token.</param>
/// <param name="escapeSequence">The escape sequence which enables the text qualifier to be embedded in a token.</param>
/// <returns>A collection of string tokens.</returns>
public static IEnumerable<string> Tokenize( string line, char delimeter, char textQualifier = '\"', char escapeSequence = '\\' )
{

    var inString = false;
    var escapeNext = false;
    var token = new StringBuilder();

    for (int i = 0 ; i < line.Length ; i++) {

        // If the last character was an escape sequence, then it doesn't matter what
        // this character is (field terminator, text qualifier, etc) because it needs
        // to appear as a part of the field value.

        if (escapeNext) {
            escapeNext = false;
            token.Append(line[i]);
            continue;
        }

        if (line[i] == escapeSequence) {
            escapeNext = true;
            continue;
        }

        if (line[i] == textQualifier) {
            inString = !inString;
            continue;
        }

        // hit the end of the current token?
        if (line[i] == delimeter && !inString) {

            yield return token.ToString();

            // clear the string builder (instead of allocating a new one)
            token.Remove(0, token.Length);

            continue;

        }

        token.Append(line[i]);

    }

    yield return token.ToString( );

}
//
///使用delimeter和指定的文本限定符和转义序列将字符串拆分为标记。
/// 
///要标记的字符串。
///标记之间的分隔符,如逗号。
///使delimeter能够嵌入到单个令牌中的文本限定符。
///使文本限定符能够嵌入到标记中的转义序列。
///字符串标记的集合。
公共静态IEnumerable标记化(字符串行、字符delimeter、字符textQualifier='\'、字符转义序列='\\')
{
var inString=false;
var escapeNext=false;
var token=新的StringBuilder();
for(int i=0;i
同意Regex不是这里工作的合适工具

当托马斯在框架中把这个链接发布到一个漂亮的小GEM时,我正在清理这个代码。我用这个方法来解析包含引号字符串和转义字符的分隔文本。它可能不是世界上最优化的,但它在我看来是很可读的,它完成了任务。

/// <summary>
/// Breaks a string into tokens using a delimeter and specified text qualifier and escape sequence.
/// </summary>
/// <param name="line">The string to tokenize.</param>
/// <param name="delimeter">The delimeter between tokens, such as a comma.</param>
/// <param name="textQualifier">The text qualifier which enables the delimeter to be embedded in a single token.</param>
/// <param name="escapeSequence">The escape sequence which enables the text qualifier to be embedded in a token.</param>
/// <returns>A collection of string tokens.</returns>
public static IEnumerable<string> Tokenize( string line, char delimeter, char textQualifier = '\"', char escapeSequence = '\\' )
{

    var inString = false;
    var escapeNext = false;
    var token = new StringBuilder();

    for (int i = 0 ; i < line.Length ; i++) {

        // If the last character was an escape sequence, then it doesn't matter what
        // this character is (field terminator, text qualifier, etc) because it needs
        // to appear as a part of the field value.

        if (escapeNext) {
            escapeNext = false;
            token.Append(line[i]);
            continue;
        }

        if (line[i] == escapeSequence) {
            escapeNext = true;
            continue;
        }

        if (line[i] == textQualifier) {
            inString = !inString;
            continue;
        }

        // hit the end of the current token?
        if (line[i] == delimeter && !inString) {

            yield return token.ToString();

            // clear the string builder (instead of allocating a new one)
            token.Remove(0, token.Length);

            continue;

        }

        token.Append(line[i]);

    }

    yield return token.ToString( );

}
//
///使用delimeter和指定的文本限定符和转义序列将字符串拆分为标记。
/// 
///要标记的字符串。
///标记之间的分隔符,如逗号。
///使delimeter能够嵌入到单个令牌中的文本限定符。
///使文本限定符能够嵌入到标记中的转义序列。
///字符串标记的集合。
公共静态IEnumerable标记化(字符串行、字符delimeter、字符textQualifier='\'、字符转义序列='\\')
{
var inString=false;
var escapeNext=false;
var token=新的StringBuilder();
for(int i=0;i
为什么不使用带有选项卡的CSV库?预期行为是什么?预期行为将捕获六个字段为什么不使用带有选项卡的CSV库?预期行为是什么?预期行为将捕获六个字段+1,因为我不知道类的存在。即使它存在于VisualBasic程序集中,它也存在于框架中,所以很高兴知道它+1因为我不知道阶级的存在。即使它存在于VisualBasic程序集中,它也存在于框架中,所以很高兴知道它!我明白你关于不使用正则表达式的说法,但在这种情况下,更新现有正则表达式可能更容易。至少,我想知道什么是regex解决方案。我明白你说的不使用regex,但在这种情况下,更新现有的regex可能更容易。至少,我想知道正则表达式的解决方案是什么。