从可能有或没有氏族标签前缀的名字中获取真实姓名

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) 似乎是多余的。

你说你想要订阅 name0name.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>

JSFiddle

审查后编辑

查看 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

它将匹配大括号之间的任何内容