【问题标题】:How do I find specific substring in a string如何在字符串中找到特定的子字符串
【发布时间】:2014-03-24 20:33:39
【问题描述】:

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

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

我的意思是这个。我正在 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)

我的计划仍处于早期阶段。我已经确定了大部分关键字,并编写了将它们置于正确大小写格式的代码。所以在上面的错误代码示例中,所有选择都将是 Select。为此,我创建了一个数组形式的关键字列表,并在以下函数中使用该数组:

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 编写糟糕的代码” 真可惜!
  • 也许使用 split() 和 join() 并遍历单词数组并分别作用于每个单词
  • where field2 = 'Please select "OK"' 这样的事情会怎样?简单的搜索和替换并非在所有情况下都有效。一个可靠的算法必须做一些基本的语法分析。
  • @Friostro - 我可以试试。现在我看到它是由其他人写的,这似乎是显而易见的答案……doh
  • @Oliverier Jacot-Descombes - 关于一揽子搜索和替换方法的局限性,我同意你的看法。就像我说的,我还处于这个过程的早期阶段。我一直在尝试使用 -- 方法来解释像 cmets 这样简单的事情。当该行以 -- 开头时,程序运行良好。当 -- 排在后面时,它每次都会失败。当我的日程安排有时间时,我会对此进行调整,但这更像是一个爱好项目,对我的日常工作有所帮助。我的主要技能是 SQL,我只是想扩展我的工具包。

标签: vb.net string replace substring


【解决方案1】:

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

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

Pete Sestoft 出色的 Programming Language Concepts book 在第 3 章介绍了解析基础知识,包括为 Micro-SQL 编写 Lexer 和 Parser 规范。

开源Irony project 包含一个SQL grammar 示例。

使用您最喜欢的搜索引擎来寻找其他人。

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

有很多方法可以实现这一点:

  1. 将字符串拆分为单词,然后在这些单词中搜索实例。
  2. 使用状态机迭代字符串并检查空格后的单词。

使用选项 2,您可以处理带引号的字符串并为每个单词维护一个索引,这是 F# 中的一个简短示例:http://fssnip.net/f6

【讨论】:

  • 感谢您的详细解答。我要去研究你提到的那本书。我仍然在编写非 SQL 代码(已经有一段时间了)。请原谅我换了一点话题,但是是去 C# 培训还是坚持一下 VB.Net 会更好吗?
  • @JaridLawson 如果您对解析感兴趣,我建议您查看 F#。 C# 和 VB.Net 之间的主要区别在于语法,功能几乎相同。也就是说,往往会有更多的 C# 示例和作业。
猜你喜欢
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多