LINUX.ORG.RU

Поиск подстроки в строке из подстроки в строке

 


1

2

Есть строка например которая содержит в себе две одинаковых подстроки - изначально я не знаю какая это подстрока может быть, но надо найти те строки в которых это встречается:

"Sun, moon, earth and Sun."
"Mars,jupyter,neptun"
"Saturn,Uran,Saturn"
То есть надо как-то найти саму подстроку(Sun и еще Saturn), а потом найти ее второе вхождение, а лучше просто сам факт этой строки.



Последнее исправление: doomer (всего исправлений: 1)

надо полнотекстовый поиск использовать. сама постхря все в какие-то структуры типа дерева превращает, где очень быстрый поиск произ водится

rtxtxtrx ★★
()
SELECT
	 y.s
	,max(y.rn)
FROM (
	SELECT 
		 a.*
		,ROW_NUMBER() OVER(PARTITION BY lower(st)) AS rn
	FROM 
		UNNEST(ARRAY[
			'Sun, moon, earth and Sun.More sun'
			,'Mars,jupyter,neptun'
			,'Saturn,Uran,Saturn'
		]) a(s)
		CROSS JOIN
			regexp_split_to_table(a.s, '[^\w]+') st
) y
WHERE
	y.rn > 1
GROUP BY 1
;

типа того, возможно

выхлоп:

|s                                |max|
|---------------------------------|---|
|Saturn,Uran,Saturn               |2  |
|Sun, moon, earth and Sun.More sun|3  |

ну, или если есть известный разделитель для определения «подстрок» - тогда по нему split.

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 4)
Ответ на: комментарий от doomer

а лучше просто сам факт этой строки.

подстрока это от одного слова

Бери awk, дели на слова, загоняй в хэш: h[$f]++

если в хеше найдется вхождение с числом более > 1, значит есть повторы подстроки в данной строке.

futurama ★★★★★
()
Ответ на: комментарий от futurama
$ awk -F'[,. ]' '{
                 delete(h)
                 for (i=1;i<=NF;i++) {h[$i]++}
                 for (x in h) {
                    if (x) {print NR, ":", x, "-->", h[x]}
                 }
  }' aaa.txt

1 : Sun --> 2
1 : and --> 1
1 : moon --> 1
1 : earth --> 1
2 : Mars --> 1
2 : neptun --> 1
2 : jupyter --> 1
3 : Uran --> 1
3 : Saturn --> 2

Видно что в первой строке Sun два раза, а в третьей Saturn

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)

подстроки или слова ?

для слов относительно просто - разбить строки по словам и найти пересечение множеств.

для подстрок сильно хуже, там видится левенштейн и-или diff алгоритмы (см.алгоритм Майерса)

MKuznetsov ★★★★★
()

А такое есть «SunmoonearthandSun» или такое «Su nmoonearthandSu n»?

ya-betmen ★★★★★
()

select regexp_match('Sun, moon, earth and Sun.', '(.+).*\1');

Jini ★★
()

Надо разделить задачу на две:

  1. выделить подстроку
  2. найти её в остальных строках (алгоритм Кнута-Морриса-Пратта)
Shushundr ★★★★
()

а лучше просто сам факт этой строки.

local text =
[[
"Sun, moon, earth and Sun."
"Mars,jupyter,neptun"
"Saturn,Uran,Saturn"
]]

local count = 0
for line in text:gmatch("[^\n]+") do
    local words = { }
    count = count + 1
    for word in line:gsub('["%.]+',''):gmatch("[^,%s]+") do
        if words[word] then
           io.write(count,' : ',line,'\n')
           break
        else
           words[word] = true
        end
    end
end
dron@gnu:~/Рабочий-стол/tetete$ lua yy.lua 
1 : "Sun, moon, earth and Sun."
3 : "Saturn,Uran,Saturn"
dron@gnu:~/Рабочий-стол/tetete$

Или можно как ща модно в компиляторах делать

local text =
[[
"Sun, moon, earth and Sun."
"Mars,jupyter,neptun"
"Saturn,Uran,Saturn"
]]

local count = 0
for line in text:gmatch("[^\n]+") do
    local words = { }
    count = count + 1
    local reline = line
    local found  = false
    for word in line:gsub('["%.]+',''):gmatch("[^,%s]+") do
        if words[word] then
           found = true
           reline = reline:gsub(word,('^'):rep(#word))
        else
           words[word] = true
        end
    end
    if found then
       io.write(count,' : ',line,'\n')
       io.write((' '):rep(#tostring(count)+3),(reline:gsub('[^%^]',' ')),'\n')
    end
end
dron@gnu:~/Рабочий-стол/tetete$ lua yy.lua 
1 : "Sun, moon, earth and Sun."
     ^^^                  ^^^  
3 : "Saturn,Uran,Saturn"
     ^^^^^^      ^^^^^^ 
dron@gnu:~/Рабочий-стол/tetete$ 
LINUX-ORG-RU ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.