.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可能更容易。至少,我想知道正则表达式的解决方案是什么。