左右弦检测算法和操作

时间:2013-02-14 13:05:03

标签: c# java regex string

我正在寻找一种机制来检测给定字符串的最小唯一左右字符串。请考虑以下文本:

   <button id="allow" type="submit" class="button-big" name="allow" value="93db44648ab3607b10e600eaf796c794" tabindex="4">

我需要获得 value 的值。因此,如果我决定选择substring,我将使用name="allow" value="作为左字符串,"作为正确的字符串(基于整体html数据的唯一性)及其相对索引。但是一个工具我正在使用的是检测唯一但最小的左字符串是w" value="

我的问题是如何找到这个?由于我没有工具的来源,我无法检测到它。

请不要在C#或任何html库中建议我使用HAP,因为上面的html代码只是一个易于理解的例子。我有其他类型的数据。

任何C#或java片段都不错。

编辑: 我正在处理的数据是非HTML,非标准,但团队描述的东西。由于其性质,它也需要用Java编码。因此我无法想到HtmlAgilityPack。

我想重视足够的字符串而不是所有工作的可能性来识别独特的模式。

2 个答案:

答案 0 :(得分:1)

从上面的示例看,您似乎正在尝试解析HTML ...

为此,我建议您使用Html Agility Pack而不是自己尝试。

答案 1 :(得分:1)

好的,从你最新的评论中我试着猜猜你想做什么,希望能给你指向正确的方向。

有些用户选择了一些文字并说“自动检测最小分隔符”。因此,您的输入是整个文本(类型为String)以及用户选择的开始和结束索引( selectionStart selectionEnd 类型int)。您的预期输出将是两个字符串,用于唯一标识整个文本中选择的开始和结束(让我们称之为 startDelimiter endDelimiter ),这样

text.indexOf(startDelimiter, 0) + startDelimiter.length() == selectionStart

text.indexOf(endDelimiter, selectionStart) - 1 == selectionEnd

两者都成立。

查找 startDelimiter 的一般方法是从 selectionStart - n selectionStart 构建子串,从 n开始= 1 ,并增加 n ,直到上面的第一个表达式为真。对于 endDelimiter 也可以这样做,但是您可以从 selectionEnd + 1 selectionEnd + n + 1 构建子串并增加 n 直到第二个表达式为真。

如果分隔符很大,这可能会变慢。在最坏的情况下, selectionStart 之前的输入文本的整个部分将是 startDelimiter ,并且只能在 selectionStart - 1 迭代之后找到。

因此,可能的改进是使用二进制搜索方法并在每次迭代时双重 n ,直到找到有效的分隔符,然后以相同的方式继续减少分隔符,直到子字符串为止不再是有效的分隔符。之前的子字符串是您的最小分隔符。