2

总的来说,我想为接受类似于 Java/C# 格式的字符串的 JavaScript 日期值实现格式化功能:“dddd/mm/yy”等。

我当前的问题仅限于 - 我有一个带有 'd's 的字符串。字符串可以像

'd/dd/ddd/dddd'
'dd/d/ddd'
'dddd     ddd       /dd'

d 之间的间隔可以是单个/多个空格或:(冒号)或/(斜杠)或一次全部(可能是一个或两个或三个字符)。例子:

'dd/dddd:ddd  d'
'dd:/ddd d   d'

如果是

  • d,我应该替换为'somestring1'(意味着我有一些字符串来替换那个特定的d)
  • 两个d,替换为'someotherString2'
  • d的,替换为'someotherotherstring'
  • d,替换为'someotherotherotherstring'

带有各自的间距或带有:(冒号)和/(斜线)

我正在尝试为此使用正则表达式。

4

4 回答 4

7

有两个替换很容易:

var res = "'dd/dddd:ddd  d'".replace(/d(?![^d])/g, '0')
                            .replace('d', '1');

它的意思是“用 0 替换所有不跟着 'non-d' 的 'd'”,然后用 1 替换所有剩余的 'd'。

你甚至可以用另一种方式做到这一点:

var res = "'dd/dddd:ddd  d'".replace(/d(?=d)/g, '0')
                            .replace('d', '1');

它的意思是“用 0 替换所有 'd' 后面的 'd'”,然后用 1 替换所有剩余的 'd'。

如果你想在替换中使用函数,你可以这样做:

var res = "'dd/dddd:ddd  d'".replace(/(d(?=d))|(d)/g, 
    function(match, p1, p2) { 
        return p1 ? '0' : '1'; 
    } 
);

结果是一样的。我们有两个捕获组,一个用于“d”,另一个用于“d”,另一个用于剩余的“d”。这些匹配被传递给一个函数,该函数接收p1p2捕获。显然,对于每个匹配项,只能定义一个捕获 ( p1or p2)(因为它们是替代项),因此使用三元运算符?检查是否p1有值然后返回0,否则返回1

对于改变的问题

如果要替换为字符串数组,可以执行以下操作:

var replaces = [ "some1", "some2", "some3", "some4" ];

var res = "'dd/dddd:ddd  d ddddd'".replace(/d+/g, 
    function(match) { 
        return match.length - 1 < replaces.length ? // check if there is a substitution
            replaces[match.length - 1] : // if there is a substitution
            match; // otherwise leave the d(s)
    } 
);
于 2013-08-02T06:46:37.543 回答
3

既然你提到这是约会,我猜1, 01,001等实际上并不是唯一可能的替代品。

因此,您可以找到任何单个d或一组d's /d+/

var revised = original.replace(/d+/, function (dees) {
    return // ...;
});

在 内function,您可以测试dees.length以确定要使用哪个值return

对于您列出的示例:

if (dees.length == 1) {
    return 'somestring1';
} else if (dees.length == 2) {
    return 'someotherString2';
} else if (dees.length == 3) {
    return 'someotherotherstring';
} else if (dees.length == 4) {
    return 'someotherotherotherstring';
}

您还可以使用ObjectorArray来匹配length键或索引。

var results = {
    1: 'somestring1',
    2: 'someotherString2',
    3: 'someotherotherstring',
    4: 'someotherotherotherstring'
];

return results[dees.length] || 'somethingelse';
于 2013-08-02T06:48:31.140 回答
1

数值的基本格式可以在没有正则表达式的情况下使用更直接的代码来处理:

  var format = "dddd/ddd/dd/d";

  var result = format.replace("dddd", formatWithFourDigits(year))
                     .replace("ddd",  formatWithThreeDigits(year))
                     .replace("dd",   formatWithTwoDigits(year))
                     .replace("d",    formatWithOneDigits(year));

对于更复杂的 - 首先标记字符串,然后将每个标记(如“dddd”)映射到为该格式执行格式化的函数。可以使用类似于其他答案中显示的正则表达式来完成标记化...

于 2013-08-02T07:00:35.123 回答
0

从最长到最短进行替换

var output=input.replace(/dddd/g,"somestring4") .replace(/ddd/g,"somestring3") .replace(/dd/g,"somestring2") .replace(/d/g,"somestring1")

这样做的一个问题是它将用 somestring4somestring1 替换 5 个连续的 dees,但不清楚在这种情况下你想要发生什么。

于 2013-08-02T09:31:56.850 回答