Vb.net 如何在字符串中找到特定的子字符串

Vb.net 如何在字符串中找到特定的子字符串,vb.net,string,replace,substring,Vb.net,String,Replace,Substring,我的完整问题标题太长,但应该在这里提问: 如何在一个字符串中找到特定子字符串的所有实例,该字符串中的空格和特殊字符可能位于子字符串的任一侧 我的意思是这个。我正在VB.Net中编写一个SQL代码格式化辅助程序。这个程序将有助于我跟进真正编写的SQL。例如,请忽略此处的语法错误,我不擅长在SQL中编写错误代码: if exists( select * from dbo.table where field1 = (if exists (select field1

我的完整问题标题太长,但应该在这里提问:

如何在一个字符串中找到特定子字符串的所有实例,该字符串中的空格和特殊字符可能位于子字符串的任一侧

我的意思是这个。我正在VB.Net中编写一个SQL代码格式化辅助程序。这个程序将有助于我跟进真正编写的SQL。例如,请忽略此处的语法错误,我不擅长在SQL中编写错误代码:

if exists(
    select *
    from dbo.table
    where field1 = (if exists (select field1
                               from dbo.table1
                               where field2 = '123')
                    select field1 from table2)
我的计划仍处于早期阶段。我已经确定了大多数关键字,并编写了代码,将它们放在适当的大小写格式中。因此,在上面的坏代码示例中,所有选择都将被选择。为此,我创建了一个数组形式的关键字列表,并在以下函数中使用此数组:

Private Function FindAndReplace(ByVal findWhat As String, _
        ByVal replaceWith As String, ByVal focusLine As String) As String
    focusLine = Microsoft.VisualBasic.Strings.Replace(focusLine, findWhat, _
        replaceWith, 1, -1, Constants.vbTextCompare)
    Return focusLine
End Function
好消息是,这对Select这样的词非常有效。像If、Go、On和End这样的词更具挑战性。如果我有单词Send,它将用单词Send替换它,因为End是一个关键字。在许多情况下,我可以通过将较小的单词放在较大的单词之前来解释这一点。我添加了Send作为关键字,因为这个词在我们系统的用户消息中出现的次数很多

我似乎无法解释诸如On、If或Go这样的词。我考虑过搜索Go、On、Go、On等,但有时Go将成为行中的第一个单词…或者是唯一的单词

我需要的是一个VB.Net方法,它可以在字符串中搜索给定子字符串的所有实例,例如If。我想我应该检查它是否是字符串中的第一个单词,或者看看它是否被空格或特殊字符的组合包围,或者没有被其他字母和下划线包围,等等。。我会更新那些符合我要求的,而不去管其他的

我对如何做到这一点一无所知,我真的需要一些帮助

我正在编写一个SQL代码格式化辅助程序

我建议从现有的SQL解析器开始

Pete Sestoft的优秀著作在第3章中介绍了解析基础知识,包括为Micro SQL编写Lexer和解析器规范

开源包括一个示例

使用您喜爱的搜索引擎查找其他人

我需要的是一个VB.Net方法,用于在字符串中搜索给定子字符串的所有实例

实现这一目标的方法有很多:

将字符串拆分为单词,然后在这些单词中搜索实例。 使用状态机迭代字符串并检查空格后的单词。
使用选项2,您可以处理带引号的字符串并为每个单词维护一个索引,下面是F中的一个简短示例:

我不擅长用SQL编写糟糕的代码,真遗憾!也许可以使用拆分和联接,并在单词数组中进行迭代,然后分别对每个单词执行操作,如where field2='请选择OK'?简单的搜索和替换在所有情况下都不起作用。一个可靠的算法必须做一些基本的语法分析。@Friostro-我可以试试。这似乎是显而易见的答案,现在我看到它是由别人写的。。。doh@OliverierJacot Descombes-我同意你关于整体搜索和替换方法的局限性。就像我说的,我还处在这个过程的早期。我一直在尝试使用-方法解释像评论这样简单的事情。当行以-开头时,程序工作正常。当-在该行的后面时,它每次都失败。当我有时间在我的日程表上时,我会调整这个,但这更多的是一个业余项目,对我的日常工作有帮助。我的主要技能是SQL,我只是想扩展我的工具包。谢谢你的详细回答。我打算研究一下你提到的那本书。我仍然在写非SQL代码,这已经有一段时间了。请原谅我切换了一点toppics,但是进入C培训还是继续使用VB.Net会更好吗?@JaridLawson如果你对解析感兴趣,我建议你看看F。C和VB.Net之间的主要区别是语法,功能几乎相同。也就是说,往往会有更多的C样本和作业。