簡體   English   中英

在文本中搜索特殊字符串的最佳方法

[英]Best way to search for a special string in a text

如果我有大約3000個字符的文字。 我想搜索具有某些特征的字符串,例如[*]類的字符串。

也就是說,我想從[a][bc]

sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]

我知道有一種稱為KMP的算法可以保證通過文本進行線性時間搜索操作,但是在這里我找不到固定的字符串,也許我必須在某個地方使用一些正則表達式。

我怎么能比O(n ^ 2)更好呢? 如果我使用Java,是否有任何光源庫?

不需要任何庫,您已經有效地描述了regex的用例! 它們針對搜索進行了高度優化,在這種情況下將為O(n)

String str = "sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]";
List<String> allMatches = new ArrayList<>();
Matcher m = Pattern.compile("\\[[^\\]]*]").matcher(str);
while (m.find()) {
    allMatches.add(m.group());
}

正則表達式演示

如果您有任何疑問,但確實希望您可以看到一些O(n),請使用以下算法:

String str = "sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]";
List<String> allMatches = new ArrayList<>();
for (int i = str.indexOf('['), j; i != -1; i = str.indexOf('[', j + 1)) {
    j = str.indexOf(']', i + 1);
    // if `j` is -1, the brackets are unbalanced. Perhaps throw an Exception?
    allMatches.add(str.substring(i, j + 1));
}

一行執行操作的方法如下:

String[] hits = str.replaceAll("^.*?\\[|][^\\]]*$", "").split("].*?\\[");

這是通過剝離直至和包括第一個/最后一個開/關方括號的前導和尾隨字符,然后在閉括號中拆分到下一個開括號(包括下一個)來實現的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM