从可能有或没有氏族标签前缀的名字中获取真实姓名
Getting real names out of names that may or may not have a clan tag prefix
GOOGLE SCRIPT 不仅仅是正常的 javascript.
我正在尝试整理 google 表格来显示在线视频游戏 Cube 2, Sauerbraten 的排名。我已经有办法在任何给定时刻获取服务器上的玩家列表。但是人总是加入和离开部落,如果一个人离开and/or加入一个新的部落,他必须重新开始排名,那将是非常令人失望的。所以我很快想出了下面的代码,希望扫描一个玩家的名字,如果名字开头有一个氏族标签,它就会去掉它。 clansPre 是一些氏族标签的数组。这个想法是,如果 va|P1、RED|P2、.rC|P3、!s]P4、[RUSS]P5、Crowd>P6、oo|P7 和 P08 一起玩游戏,他们的统计数据将记录在 P1 下、P2、P3、P4、P5、P6、P7 和 P08。然而,我能做的有限测试表明它总是删除前 3 个字符,无论名称如何。另外,当我尝试使用 startWith() 时,cName 是我尝试以字符串形式获取名称的尝试。
var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"];
var numClans = clansPre.length;
function nameWoClan(name){
var cName = name.substring(0, name.length)
for(var cC = 0; cC<numClans; cC++) {
if(cName.search(clansPre[cC]) == 0) {
return cName.substring(clansPre[cC].length, name.length)
}
}
return cName;
}
可能是我完全傻了,但说句实话,我学过的唯一没有自学的编程语言是Java,那是去年的,我真的没有从那以后需要使用 Java,所以我有点生疏了。无论如何,谢谢!
您的尝试方向正确。
但是根据您的代码。
var cName = name.substring(0, name.length)
似乎是多余的。
你说你想要订阅 name
从 0
到 name.length
的起始索引,这与
相同
var cName = name;
现在我写了一个更复杂的例子来确定氏族名字是否是名字的一部分。如果是,则删除氏族名称,但也会 returns 具有氏族名称的对象。现在此方法不区分大小写(因为它降低了文本)。因此,如果您想要区分大小写的匹配,请删除两个调用 toLowerCase()
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
下面我做了一个简单的例子。
$('#extract-name').on('click', function() {
var names = $('#player-names').val().split('\n');
$('#names-list-body').html(''); //clear the table
names.forEach(function(item, index) {
var name = nameWoClan(item);
if (name) {
$('#names-list-body').append($('<tr><td>' + item + '</td><td>' + name.clanName + '</td><td>' + name.playerName + '</td></tr>'));
}
});
});
var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"];
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
One full name per line
</p>
<textarea id="player-names" rows="5" cols="65">
john
.rC|sally
[RUSS]Superman
oo|Batman
RED|MAN
RED|va|
</textarea>
<br/>
<button type="button" id="extract-name">
Extract Name
</button>
<table id="names-list">
<thead>
<tr>
<th>Original Name</th>
<th>Clan Name</th>
<th>Player Name</th>
</tr>
</thead>
<tbody id="names-list-body"></tbody>
</table>
审查后编辑
查看 Google 电子表格脚本后(以前从未见过)。发现我们需要一些额外的位。第一个 startsWith
似乎不被支持。不知道为什么。所以我写了一个简单的开始函数。
function myStartsWith(name, clanName){
name = name.toLowerCase();
clanName = clanName.toLowerCase();
var cNameLen = clanName.length;
var nameLen = name.length;
return cNameLen < nameLen && name.substring(0, cNameLen) === clanName;
}
现在我创建了一个示例副本 Copy of Pasta Ranks 并更新了脚本。
function myStartsWith(name, clanName){
name = name.toLowerCase();
clanName = clanName.toLowerCase();
var cNameLen = clanName.length;
var nameLen = name.length;
return cNameLen < nameLen && name.substring(0, cNameLen) === clanName;
}
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
var match = myStartsWith(name, clansPre[i]);
if (match) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
function testing(){
//get the sheet to query
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[2];
//get the last row index
var lastRow = sheet.getLastRow();
//get the player names range O2:O18 //removes header
var range = sheet.getRange(2, 15, lastRow);
//get the values for the range
var data = range.getValues()
var names = [];
//iterate the range getting the records. note index [0] as values is a multi-dimension name
for(var i = 0;i< lastRow;i++){
var name = nameWoClan(data[i][0]);
if(name)
{
names.push(name);
}
}
var n = names;
}
它不是很漂亮,但如果你调试 testing
函数并在最后的 var n = names
上设置断点,你会看到 names
包含玩家名称和氏族名称的列表。
还值得注意的是,none 的玩家名称实际上有一个氏族名称,所以我添加了 evil.
作为测试用例。
function removeClanTag(name) {
var index = name.search(/>|\]|\||'/g);
return name.substring(index+1);
}
var u = [
"tag>username",
"tag|username",
"tag'username",
"tag]username",
];
for (var i in u) {
console.log(removeClanTag(u[i]));
}
您可以尝试扫描所有标签结尾的位置,然后从 +1 中删除该点之后的文本。
如果你想做一些更复杂的事情,你可以创建一个正则表达式来匹配特定的部落标签模式,比如
/[.*]/g
它将匹配大括号之间的任何内容
GOOGLE SCRIPT 不仅仅是正常的 javascript.
我正在尝试整理 google 表格来显示在线视频游戏 Cube 2, Sauerbraten 的排名。我已经有办法在任何给定时刻获取服务器上的玩家列表。但是人总是加入和离开部落,如果一个人离开and/or加入一个新的部落,他必须重新开始排名,那将是非常令人失望的。所以我很快想出了下面的代码,希望扫描一个玩家的名字,如果名字开头有一个氏族标签,它就会去掉它。 clansPre 是一些氏族标签的数组。这个想法是,如果 va|P1、RED|P2、.rC|P3、!s]P4、[RUSS]P5、Crowd>P6、oo|P7 和 P08 一起玩游戏,他们的统计数据将记录在 P1 下、P2、P3、P4、P5、P6、P7 和 P08。然而,我能做的有限测试表明它总是删除前 3 个字符,无论名称如何。另外,当我尝试使用 startWith() 时,cName 是我尝试以字符串形式获取名称的尝试。
var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"];
var numClans = clansPre.length;
function nameWoClan(name){
var cName = name.substring(0, name.length)
for(var cC = 0; cC<numClans; cC++) {
if(cName.search(clansPre[cC]) == 0) {
return cName.substring(clansPre[cC].length, name.length)
}
}
return cName;
}
可能是我完全傻了,但说句实话,我学过的唯一没有自学的编程语言是Java,那是去年的,我真的没有从那以后需要使用 Java,所以我有点生疏了。无论如何,谢谢!
您的尝试方向正确。
但是根据您的代码。
var cName = name.substring(0, name.length)
似乎是多余的。
你说你想要订阅 name
从 0
到 name.length
的起始索引,这与
var cName = name;
现在我写了一个更复杂的例子来确定氏族名字是否是名字的一部分。如果是,则删除氏族名称,但也会 returns 具有氏族名称的对象。现在此方法不区分大小写(因为它降低了文本)。因此,如果您想要区分大小写的匹配,请删除两个调用 toLowerCase()
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
下面我做了一个简单的例子。
$('#extract-name').on('click', function() {
var names = $('#player-names').val().split('\n');
$('#names-list-body').html(''); //clear the table
names.forEach(function(item, index) {
var name = nameWoClan(item);
if (name) {
$('#names-list-body').append($('<tr><td>' + item + '</td><td>' + name.clanName + '</td><td>' + name.playerName + '</td></tr>'));
}
});
});
var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"];
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
One full name per line
</p>
<textarea id="player-names" rows="5" cols="65">
john
.rC|sally
[RUSS]Superman
oo|Batman
RED|MAN
RED|va|
</textarea>
<br/>
<button type="button" id="extract-name">
Extract Name
</button>
<table id="names-list">
<thead>
<tr>
<th>Original Name</th>
<th>Clan Name</th>
<th>Player Name</th>
</tr>
</thead>
<tbody id="names-list-body"></tbody>
</table>
审查后编辑
查看 Google 电子表格脚本后(以前从未见过)。发现我们需要一些额外的位。第一个 startsWith
似乎不被支持。不知道为什么。所以我写了一个简单的开始函数。
function myStartsWith(name, clanName){
name = name.toLowerCase();
clanName = clanName.toLowerCase();
var cNameLen = clanName.length;
var nameLen = name.length;
return cNameLen < nameLen && name.substring(0, cNameLen) === clanName;
}
现在我创建了一个示例副本 Copy of Pasta Ranks 并更新了脚本。
function myStartsWith(name, clanName){
name = name.toLowerCase();
clanName = clanName.toLowerCase();
var cNameLen = clanName.length;
var nameLen = name.length;
return cNameLen < nameLen && name.substring(0, cNameLen) === clanName;
}
function nameWoClan(name) {
if (!name)
return null;
var clanName = '';
for (var i = 0; i < clansPre.length; i++) {
var match = myStartsWith(name, clansPre[i]);
if (match) {
clanName = name.substring(0, clansPre[i].length);
name = name.substring(clansPre[i].length);
break;
}
}
return {
clanName: clanName,
playerName: name
}
}
function testing(){
//get the sheet to query
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[2];
//get the last row index
var lastRow = sheet.getLastRow();
//get the player names range O2:O18 //removes header
var range = sheet.getRange(2, 15, lastRow);
//get the values for the range
var data = range.getValues()
var names = [];
//iterate the range getting the records. note index [0] as values is a multi-dimension name
for(var i = 0;i< lastRow;i++){
var name = nameWoClan(data[i][0]);
if(name)
{
names.push(name);
}
}
var n = names;
}
它不是很漂亮,但如果你调试 testing
函数并在最后的 var n = names
上设置断点,你会看到 names
包含玩家名称和氏族名称的列表。
还值得注意的是,none 的玩家名称实际上有一个氏族名称,所以我添加了 evil.
作为测试用例。
function removeClanTag(name) {
var index = name.search(/>|\]|\||'/g);
return name.substring(index+1);
}
var u = [
"tag>username",
"tag|username",
"tag'username",
"tag]username",
];
for (var i in u) {
console.log(removeClanTag(u[i]));
}
您可以尝试扫描所有标签结尾的位置,然后从 +1 中删除该点之后的文本。
如果你想做一些更复杂的事情,你可以创建一个正则表达式来匹配特定的部落标签模式,比如
/[.*]/g
它将匹配大括号之间的任何内容