模块讨论: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)