Module talk:String

message: :請求新增一個切割字串函數，已在Module:Chemicals中使用（Special:Diff/47444448，函式原型： string[] str::split(string,string)）
replies: text: 但Module:Chemicals應該是要放置化學相關函數

text: 而字串相關函數應置於此，因此申請編輯請求
function str.split(inputstr, sep)
        if sep == nil then
                sep = "%s"
        end
        local result={} ; i=1
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                result[i] = str
                i = i + 1
        end
        return result
end
lua沒有函數載入順序問題，以上函式放在任意位置皆可
--　宇帆（明年二月加入維基將滿十周年！留言·歡迎簽到·聯絡） 2017年12月19日 (二) 17:55 (UTC)
*(沙盒測試帳號發言)：該函數已應用於Module:Chemicals中，但它不應置於Module:Chemicals中，而應置於Module:String。--　宇帆 by 沙盒帳號（今年二月加入維基將滿十周年！留言·歡迎簽到·聯絡） 2018年1月9日 (二) 14:21 (UTC)
**(沙盒測試帳號發言)提供Doc檔
=== split ===
replies: text: :function prototypt（by c++）：string[] 模块::String::str::split ( const string inputstr, const string sep );

text: This function splits a String into an array of strings by separating the string into substrings, using a specified separator string to determine where to make each split.
Usage:

text: str.split( target_string, separator_string )
Parameters:
; inputstr target_string

text: The string to split
; sep separator_string

text: Specifies the string which denotes the points at which each split should occur. 
*(沙盒測試帳號發言)--　宇帆 by 沙盒帳號（今年二月加入維基將滿十周年！留言·歡迎簽到·聯絡） 2018年1月10日 (三) 05:14 (UTC)
*，无害的编辑。--Antigng（留言） 2018年1月10日 (三) 06:13 (UTC)
*，如果完成编辑，任何模块都可以通过调用本模块执行这个函数。--⚞★⚟ 2018年1月12日 (五) 07:54 (UTC)
**就我所知的程式語言，split的功能是如此實作為少數，我所知的只有C/C++的strtok是如此，以Java, PHP, Python的split都是用完整字串來切割（甚至是正規表達式），較少為用字串任一字元來切割（例如 split("a-b--c-d", "--") 應該得到 ["a-b", "c-d"] 而非 ["a", "b", "c", "d"]）。另外此函數的實作方式，在傳入特定字串時會有非預期情況發生。--Xiplus#Talk 2018年2月1日 (四) 06:26 (UTC)
***：那麼您建議可以如何修改？--　宇帆（2/28加入維基將滿十周年！留言·歡迎簽到·聯絡） 2018年2月1日 (四) 08:07 (UTC)
****在inputstr搜尋sep，並把搜尋到的位置之前字串加入result，並從搜尋到位置+sep的長度，繼續前述操作直到搜尋無結果，最後將剩下文字也加入result。--Xiplus#Talk 2018年2月9日 (五) 08:26 (UTC)
**(沙盒測試帳號發言) 沙盒測試帳號提供結果
function p.split(inputstr, sep, no_pattern, ignore_null)
	--#invoke 支援
	if type(inputstr) == type({table}) then
		if not getArgs then getArgs = require('Module:Arguments').getArgs end
		args = getArgs(inputstr, {parentFirst=true})
		for arg_name, arg_value in pairs( args ) do
			if arg_name == 1 or arg_name == '1' or arg_name == "str" or arg_name == "inputstr" or arg_name == "input" then
				input_str = arg_value
			elseif arg_name == 2 or arg_name == '2' or arg_name == "sep" or arg_name == "separator" then
				separ = arg_value
			elseif arg_name == 3 or arg_name == '3' or arg_name == "no_pattern" or arg_name == "no pattern" then
				no_pattern_flag = arg_value
			elseif arg_name == 4 or arg_name == '4' or arg_name == "ignore_null" or arg_name == "ignore null" then
				ignore_null_flag = arg_value
			elseif arg_name == 5 or arg_name == '5' or arg_name == "format" then
				format = arg_value or "*\n";
			end
		end
		if not yesno then yesno = require('Module:Yesno') end
		no_pattern_flag = yesno( no_pattern_flag or 'yes' )
		ignore_null_flag = yesno( ignore_null_flag or 'no' )
		is_invoke = true
		format = mw.ustring.gsub(format or "*\n", "%{%{%{.-%}%}%}", "%%s" );
		it = mw.ustring.find(format, "%%s", 1)
		if it == nil then format = format .. "%s" end
		format = mw.ustring.gsub(format, "\\n", "\n")
	else
		input_str = inputstr
		separ = sep
		no_pattern_flag = no_pattern
		ignore_null_flag = ignore_null
		is_invoke = false
	end
	input_str = input_str or  
	separ = separ or "%s"
	if no_pattern_flag == nil then no_pattern_flag = true end
	if ignore_null_flag == nil then ignore_null_flag = false end
	mw.log(no_pattern_flag, ignore_null_flag);
	length = mw.ustring.len(input_str)
	--split函數起點
	if no_pattern_flag then
		separ = mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(separ, 
			"%[", "%["), "%]", "%]"), "%{", "%{"), "%}", "%}"), "%%", "%%%%"), "%)", "%)"), "%-", "%-"),
			"%^", "%^"), "%$", "%$"), "%(", "%("), "%.", "%."), "%*", "%*"), "%+", "%+"), "%|", "%|");
	end
	iterator = 1 ; i = 1 ; flag = true
	result = {}
	separ_str_begin, separ_str_end = mw.ustring.find(input_str, separ, iterator)
	--
	debug1 = 1
	--
	while flag do
		debug1 = debug1 + 1
		if separ_str_begin == nil or iterator > length or debug1 >= 100 then
			separ_str_begin = 0
			separ_str_end = -2
			flag = false
		end
		if separ_str_end < separ_str_begin then separ_str_end = separ_str_begin end
		mw.log(separ_str_begin, separ_str_end, iterator)
		finded_str = mw.ustring.sub(input_str, iterator, separ_str_begin - 1)
		if not(mw.text.trim(finded_str) ==  and ignore_null_flag) then
			result[i] = finded_str
			mw.log("\"" .. result[i] .. "\"")
			i = i + 1
		end
		iterator = separ_str_end + 1
		separ_str_begin, separ_str_end = mw.ustring.find(input_str, separ, iterator)
	end
	if is_invoke then
		body = ''
		for i, result_str in pairs( result ) do
			body = body .. mw.ustring.gsub(format, "%%s", result_str)
		end
		return body
	end
	return result;
end
replies: text: :以及測試結果
=== 測試1 ===
*---123-45-6-----、-
=== 測試2 ===
*123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜娜奇
=== 測試3 ===
*123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜奇
=== 測試4 ===
*123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜娜
=== 測試5 ===
*123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜
*(沙盒測試帳號提供結果)以上--　(沙盒測試帳號發言)宇帆 by 沙盒帳號（2/28加入維基將滿十周年！留言·歡迎簽到） 2018年2月10日 (六) 09:58 (UTC)(沙盒測試帳號發言)
**：已修改，並加入支援。請檢查是否合理，感謝--　宇帆（2/28加入維基將滿十周年！留言·歡迎簽到·聯絡） 2018年2月10日 (六) 10:01 (UTC)
***。--Xiplus#Talk 2018年4月30日 (一) 03:29 (UTC)
thread_title:  編輯請求 

message: ::function prototypt（by c++）：string[] 模块::String::str::split ( const string inputstr, const string sep );
replies: text: This function splits a String into an array of strings by separating the string into substrings, using a specified separator string to determine where to make each split.
Usage:

text: str.split( target_string, separator_string )
Parameters:
; inputstr target_string

text: The string to split
; sep separator_string

text: Specifies the string which denotes the points at which each split should occur. 
</div></div>
*(沙盒測試帳號發言)--　宇帆 by 沙盒帳號（今年二月加入維基將滿十周年！留言·歡迎簽到·聯絡） 2018年1月10日 (三) 05:14 (UTC)
*，无害的编辑。--Antigng（留言） 2018年1月10日 (三) 06:13 (UTC)
*，如果完成编辑，任何模块都可以通过调用本模块执行这个函数。--⚞★⚟ 2018年1月12日 (五) 07:54 (UTC)
**就我所知的程式語言，split的功能是如此實作為少數，我所知的只有C/C++的strtok是如此，以Java, PHP, Python的split都是用完整字串來切割（甚至是正規表達式），較少為用字串任一字元來切割（例如 split("a-b--c-d", "--") 應該得到 ["a-b", "c-d"] 而非 ["a", "b", "c", "d"]）。另外此函數的實作方式，在傳入特定字串時會有非預期情況發生。--Xiplus#Talk 2018年2月1日 (四) 06:26 (UTC)
***：那麼您建議可以如何修改？--　宇帆（2/28加入維基將滿十周年！留言·歡迎簽到·聯絡） 2018年2月1日 (四) 08:07 (UTC)
****在inputstr搜尋sep，並把搜尋到的位置之前字串加入result，並從搜尋到位置+sep的長度，繼續前述操作直到搜尋無結果，最後將剩下文字也加入result。--Xiplus#Talk 2018年2月9日 (五) 08:26 (UTC)
**(沙盒測試帳號發言) 沙盒測試帳號提供結果
function p.split(inputstr, sep, no_pattern, ignore_null)
	--#invoke 支援
	if type(inputstr) == type({table}) then
		if not getArgs then getArgs = require('Module:Arguments').getArgs end
		args = getArgs(inputstr, {parentFirst=true})
		for arg_name, arg_value in pairs( args ) do
			if arg_name == 1 or arg_name == '1' or arg_name == "str" or arg_name == "inputstr" or arg_name == "input" then
				input_str = arg_value
			elseif arg_name == 2 or arg_name == '2' or arg_name == "sep" or arg_name == "separator" then
				separ = arg_value
			elseif arg_name == 3 or arg_name == '3' or arg_name == "no_pattern" or arg_name == "no pattern" then
				no_pattern_flag = arg_value
			elseif arg_name == 4 or arg_name == '4' or arg_name == "ignore_null" or arg_name == "ignore null" then
				ignore_null_flag = arg_value
			elseif arg_name == 5 or arg_name == '5' or arg_name == "format" then
				format = arg_value or "*\n";
			end
		end
		if not yesno then yesno = require('Module:Yesno') end
		no_pattern_flag = yesno( no_pattern_flag or 'yes' )
		ignore_null_flag = yesno( ignore_null_flag or 'no' )
		is_invoke = true
		format = mw.ustring.gsub(format or "*\n", "%{%{%{.-%}%}%}", "%%s" );
		it = mw.ustring.find(format, "%%s", 1)
		if it == nil then format = format .. "%s" end
		format = mw.ustring.gsub(format, "\\n", "\n")
	else
		input_str = inputstr
		separ = sep
		no_pattern_flag = no_pattern
		ignore_null_flag = ignore_null
		is_invoke = false
	end
	input_str = input_str or  
	separ = separ or "%s"
	if no_pattern_flag == nil then no_pattern_flag = true end
	if ignore_null_flag == nil then ignore_null_flag = false end
	mw.log(no_pattern_flag, ignore_null_flag);
	length = mw.ustring.len(input_str)
	--split函數起點
	if no_pattern_flag then
		separ = mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(separ, 
			"%[", "%["), "%]", "%]"), "%{", "%{"), "%}", "%}"), "%%", "%%%%"), "%)", "%)"), "%-", "%-"),
			"%^", "%^"), "%$", "%$"), "%(", "%("), "%.", "%."), "%*", "%*"), "%+", "%+"), "%|", "%|");
	end
	iterator = 1 ; i = 1 ; flag = true
	result = {}
	separ_str_begin, separ_str_end = mw.ustring.find(input_str, separ, iterator)
	--
	debug1 = 1
	--
	while flag do
		debug1 = debug1 + 1
		if separ_str_begin == nil or iterator > length or debug1 >= 100 then
			separ_str_begin = 0
			separ_str_end = -2
			flag = false
		end
		if separ_str_end < separ_str_begin then separ_str_end = separ_str_begin end
		mw.log(separ_str_begin, separ_str_end, iterator)
		finded_str = mw.ustring.sub(input_str, iterator, separ_str_begin - 1)
		if not(mw.text.trim(finded_str) ==  and ignore_null_flag) then
			result[i] = finded_str
			mw.log("\"" .. result[i] .. "\"")
			i = i + 1
		end
		iterator = separ_str_end + 1
		separ_str_begin, separ_str_end = mw.ustring.find(input_str, separ, iterator)
	end
	if is_invoke then
		body = ''
		for i, result_str in pairs( result ) do
			body = body .. mw.ustring.gsub(format, "%%s", result_str)
		end
		return body
	end
	return result;
end
replies: text: :以及測試結果
thread_title:  split 

message: *---123-45-6-----、-
thread_title:  測試1 

message: *123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜娜奇
thread_title:  測試2 

message: *123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜奇
thread_title:  測試3 

message: *123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜娜
thread_title:  測試4 

message: *123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇、娜
</div></div>
*(沙盒測試帳號提供結果)以上--　(沙盒測試帳號發言)宇帆 by 沙盒帳號（2/28加入維基將滿十周年！留言·歡迎簽到） 2018年2月10日 (六) 09:58 (UTC)(沙盒測試帳號發言)
**：已修改，並加入{{#invoke:}}支援。請檢查是否合理，感謝--　宇帆（2/28加入維基將滿十周年！留言·歡迎簽到·聯絡） 2018年2月10日 (六) 10:01 (UTC)
***。--Xiplus#Talk 2018年4月30日 (一) 03:29 (UTC)
thread_title:  測試5 

message: :修訂內容：與此修訂相同:wikiversity:zh:special:diff:50823:模块:String
replies: text: 理由：刪除已經用不到的偵錯用log輸出。

text: *：已確認CAS號辨識函數已佈署到所有化學品訊息框模板，且截至今天為止未發生錯誤，因此偵錯用log輸出已不再需要，應予以移除。
--　宇帆（維基貢獻十周年！留言·歡迎簽到[試用小工具]） 2018年8月17日 (五) 12:27 (UTC)
thread_title:  編輯請求 

message: Hi, copied the content in Template:College color list from English wiki and they said 腳本錯誤：函數「join」不存在。
So is it possible to add the join features from English wiki? Thanks
--[[
join
Join all non empty arguments together; the first argument is the separator.
Usage:
{{#invoke:String|join|sep|one|two|three}}
]]
function str.join(frame)
	local args = {}
	local sep
	for _, v in ipairs( frame.args ) do
		if sep then
			if v ~=  then
				table.insert(args, v)
			end
		else
			sep = v
		end
	end
	return table.concat( args, sep or  )
end
Winston（留言） 2020年2月19日 (三) 03:00 (UTC)
thread_title:  String Join 

message: Module:String/draft，新增enwiki的count功能。空氣小貓（留言） 2020年9月1日 (二) 16:35 (UTC)
replies: text: 提供的版本將部分錯誤訊息改成了英文，請修正後重開請求。--Xiplus#Talk 2020年9月30日 (三) 08:29 (UTC)
thread_title: 編輯請求 2020-09-01

message: 編輯請求 2020-09-01的要求已完成，請複查。空氣小貓（留言） 2020年10月13日 (二) 18:49 (UTC)
replies: text: 。空氣小貓（留言） 2020年10月13日 (二) 18:50 (UTC)
*有數個被廣泛使用之英文區沒有的函數遭到無道理的覆蓋或取代。-- 娜娜奇🐰楓香花茶☕（宇帆·☎️·☘️） 2020年10月13日 (二) 19:01 (UTC)
thread_title: 編輯請求 2020-10-13

message: 是否可以添加enwiki的“count(计数)”功能？--Bouzinac（留言） 2021年3月26日 (五) 14:19 (UTC)
thread_title: count