Как найти позицию n-го токена - PullRequest
4 голосов
/ 21 июля 2009

У нас есть строка с максимальным пределом в 20 слов. Если пользователь вводит что-то более чем из 20 слов, нам нужно обрезать строку до ее 20-го слова. Как мы можем автоматизировать это? Мы можем найти 20-й токен с помощью #GetToken (myString, 20, '') #, но не уверены в том, как найти его положение для обрезки влево. Есть идеи? Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 21 июля 2009

UDF ListLeft () должен делать то, что вы хотите. Он берет список и возвращает список с указанным вами количеством элементов. «Пробел» отлично подходит в качестве разделителя.

/**
 * A Left() function for lists.  Returns the n leftmost elements from the specified list.
 * 
 * @param list      List you want to return the n leftmost elements from. 
 * @param numElements      Number of leftmost elements you want returned. 
 * @param delimiter      Delimiter for the list.  Default is the comma. 
 * @return Returns a string, 
 * @author Rob Brooks-Bilson (rbils@amkor.com) 
 * @version 1, April 24, 2002 
 */
function ListLeft(list, numElements){
  var tempList="";
  var i=0;
  var delimiter=",";
  if (ArrayLen(arguments) gt 2){
    delimiter = arguments[3];
  }
  if (numElements gte ListLen(list, delimiter)){
    return list;
  }
  for (i=1; i LTE numElements; i=i+1){
    tempList=ListAppend(tempList, ListGetAt(list, i, delimiter), delimiter);
  }
  return tempList;
}

p.s. CFLIB.org является выдающимся ресурсом и обычно является моей первой остановкой, когда я ищу что-то подобное. Я очень рекомендую это.

2 голосов
/ 21 июля 2009

Можно также использовать регулярное выражение (группа # 1 содержит совпадение): ^(?:\w+\s+){19}(\w+)

0 голосов
/ 21 июля 2009

Не уверен, что CF предоставляет это, но обычно существует метод LastIndexOf (string token). Используйте это в сочетании с функцией подстроки. Для isntance (psuedocode):

string lastWord = GetToken(myString, 20, ' ');
string output = Substring(mystring, 0, LastIndexOf(mystring, lastWord)+StrLength(lastWord));
0 голосов
/ 21 июля 2009

Может быть, вы могли бы избежать обрезки и вместо этого восстановить результат с нуля, что-то вроде (псевдокод, я не знаю ColdFusion):

  result = ''
  for (i = 0; i < 20; ++i)
  {
     result = result + GetToken(myString, i, ' ');
  }

Будет ли это работать?

...