Javascript中选择性的.touppercase()实现



我用字体图标代替文本。一个查找表看起来像:-

 var sym = {'(a)': (apple icon in utf-8),
            '(A)': (angel icon),
            ...
            '(g)': (...),
            '(G)': (last icon) } anything after G is ignored.

现在(a)iPhone翻译成大写应该是(a)IPHONE,留下(a)不变,因为大写的(A)是一个完全不同的图标。任何与(r)iPhone(tm)iPhone不匹配的内容都将被转换。

问题:是否有一种算法可以避免逐个字符检查,也许使用本机regex函数?附件是Javascript代码:

'(a) (az)text'.replace(/(w+)/g, function (matches) { 
          return matches } )
    .replace(/.*(?!(w+)).*/g, function (matches) { // needs fixing
          return matches.toUpperCase() } 
 ) // returns "(A) (AZ)text"

这可以通过像在这个答案中那样构造正则表达式并提供一个替换函数来有条件地替换字符串来实现:

// ES5
'(a) (az)text'.replace(/((w+))|(?:(?!(w+)).)*/g, function ($0, $1) {
      return $1 == null ? $0.toUpperCase() : $1
});
// ES6
'(a) (az)text'.replace(/((w+))|(?:(?!(w+)).)*/g,
                       ($0, $1) => $1 == null ? $0.toUpperCase() : $1);

正则表达式由两个子表达式中的一个组成:

  • 初始正则表达式,描述不希望替换(w+)的文本。
  • "反向"正则表达式,描述您想要替换的文本,通过使用每个字符的检查和重复模式构造:(?:(?!(w+)).)*

第二种方法不能单独使用,因为由于正则表达式搜索函数的失败行为,它可以在(a)中匹配a)。我们需要初始的正则表达式来为我们消费和执行bump-along。

每个分支上都需要一个捕获组(在本例中,我们使用第一个分支),以便您可以检查匹配属于哪个替代。


在同样的问题上,我有一个替代的解决方案,不需要改变正则表达式,用RegExp.exec实现。

我不确定您打算如何使用它,也不确定您是否需要某种复杂的解析器,但这里有一个解决方案,可能会帮助您找到您的方式:http://jsbin.com/jabuloqaba/edit?html,js,output

如果你希望它从一大块文本中提取这些图标/标签,在我看来,你需要一些方法来分隔标签的末尾,以便大写,所以在这一点上,你可能只是把整个部分包裹在一些元素中。

这个脚本在这种情况下工作得很好。

基本上所有的图标生成都在IIFE返回的图标器对象中(顶部的大包装函数blob)。IIFE返回一个具有两个公开属性的对象,其中一个是方法,另一个是另一个对象。方法是iconize,这是你与对象交互的主要方式,但是你也会想要使用iconMap来设置你问题中的地图。

之后,剩下的就是选择你想要运行图标器的元素,并让它工作。

看起来你可能最需要的是正则表达式的帮助,所以让我详细说明一下:

让我们把表达式拆分:

/   (.*)   (   (S+)   )   (.*)   /
    before      icon         after

(和)确保正则表达式正在查找文字括号字符。没有转义反斜杠的括号是捕获组,您可以看到它们被映射到图标splitIcon方法中之前和之后。

从那里我们可以进行查找,一切都很顺利。如果你有任何问题,请告诉我!

最新更新