模組討論:String
Bouzinac在话题“count”中的最新留言:3年前
編輯請求
编辑请求已处理
- 請求新增一個切割字串函數,已在Module:Chemicals中使用(Special:Diff/47444448,函式原型: string[] str::split(string,string))
- 但Module:Chemicals應該是要放置化學相關函數
- 而字串相關函數應置於此,因此申請編輯請求
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
编辑- function prototypt(by c++):
string[] 模块::String::str::split ( const string inputstr, const string sep );
- function prototypt(by c++):
- 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:
- str.split( target_string, separator_string )
Parameters:
- inputstr target_string
- The string to split
- sep separator_string
- 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)
- @A2569875、Antigng、Great_Brightstar:就我所知的程式語言,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)- (?)疑問:@Xiplus:那麼您建議可以如何修改?-- 宇帆(2/28加入維基將滿十周年!留言·歡迎簽到·聯絡) 2018年2月1日 (四) 08:07 (UTC)
- Xiplus#Talk 2018年2月9日 (五) 08:26 (UTC) 在inputstr搜尋sep,並把搜尋到的位置之前字串加入result,並從搜尋到位置+sep的長度,繼續前述操作直到搜尋無結果,最後將剩下文字也加入result。--
- (?)疑問:@Xiplus:那麼您建議可以如何修改?-- 宇帆(2/28加入維基將滿十周年!留言·歡迎簽到·聯絡) 2018年2月1日 (四) 08:07 (UTC)
- (沙盒測試帳號發言) 沙盒測試帳號提供結果
- @A2569875、Antigng、Great_Brightstar:就我所知的程式語言,split的功能是如此實作為少數,我所知的只有C/C++的strtok是如此,以Java, PHP, Python的split都是用完整字串來切割(甚至是正規表達式),較少為用字串任一字元來切割(例如
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 "*{{{1}}}\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 "*{{{1}}}\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
- 以及測試結果
測試1
编辑---123-45-6-----
、-
- 123
- 45
- 6
測試2
编辑123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇
、娜娜奇
- 123
- 456
- 789
- 910娜娜
- 奇123奇
測試3
编辑123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇
、娜奇
- 123娜
- 456娜
- 789娜
- 娜
- 910娜娜娜
- 奇123奇
測試4
编辑123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇
、娜娜
- 123
- 奇456
- 奇789
- 奇
- 奇910
- 奇奇123奇
測試5
编辑123娜娜奇456娜娜奇789娜娜奇娜娜奇910娜娜娜娜奇奇123奇
、娜
- 123
- 奇456
- 奇789
- 奇
- 奇910
- 奇奇123奇
編輯請求
编辑请求已处理--Xiplus#Talk 2018年10月20日 (六) 12:36 (UTC)
- 修訂內容:與此修訂相同:wikiversity:zh:special:diff:50823:模块:String
- 理由:刪除已經用不到的偵錯用log輸出。
- (~)補充:已確認CAS號辨識函數已佈署到所有化學品訊息框模板,且截至今天為止未發生錯誤,因此偵錯用log輸出已不再需要,應予以移除。
String Join
编辑请求已处理--Xiplus#Talk 2020年2月26日 (三) 00:41 (UTC)
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
編輯請求 2020-09-01
编辑请求已拒绝
Module:String/draft,新增enwiki的count功能。 2020年9月1日 (二) 16:35 (UTC)
- 提供的版本將部分錯誤訊息改成了英文,請修正後重開請求。--Xiplus#Talk 2020年9月30日 (三) 08:29 (UTC)
編輯請求 2020-10-13
编辑请求已拒绝--Xiplus#Talk 2020年10月30日 (五) 05:06 (UTC)
編輯請求 2020-09-01的要求已完成,請複查。 2020年10月13日 (二) 18:49 (UTC)
count
编辑是否可以添加enwiki的“count(计数)”功能?--Bouzinac(留言) 2021年3月26日 (五) 14:19 (UTC)