实现日期格式类似于Java / C#(如“dddd / mm / yy”)

时间:2013-08-02 06:40:36

标签: javascript regex

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

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

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

d's之间的间隙可以是单个/多个空格或:(冒号)或/(斜杠)或所有这些(可能是一个或两个或三个字符) 。例子:

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

如果是

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

各自的间距或:(冒号)和/(斜杠)

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

5 个答案:

答案 0 :(得分:7)

有两个替换它很容易:

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

这意味着“替换所有'd'后面没有'非-d'和0”,然后将所有剩余的'd'替换为1.

你甚至可以用另一种方式来做:

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

表示“将所有'd'替换为'd'后替换为0”,然后将所有剩余的'd'替换为1.

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

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

结果是一样的。我们有两个捕获组,一个用于'd',后面跟着另一个'd',另一个用于剩余的'd'。这些匹配将传递给一个函数,该函数在p1p2中接收捕获。显然,对于每个匹配,只能定义其中一个捕获(p1p2)(因为它们是备选方案),因此使用三元运算符?检查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) } );

对于已更改的问题

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

{{1}}

答案 1 :(得分:3)

由于您已经提到这是针对某个日期的,我猜测101001等实际上并不是唯一可能的替代品。< / p>

因此,您可以找到dd/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'; } 的值。

对于您列出的示例:

Object

您还可以使用Arraylengthvar results = { 1: 'somestring1', 2: 'someotherString2', 3: 'someotherotherstring', 4: 'someotherotherotherstring' ]; return results[dees.length] || 'somethingelse'; 与键或索引相匹配。

{{1}}

答案 2 :(得分: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));

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

答案 3 :(得分:0)

首先将每个d后面的非d或字符串的末尾替换为1.然后用0替换每个剩余的d。

var input="d ddd dd : d/dddd d"

var output=input.replace(/d($|[^d])/g,'1$1').replace(/d/g,0)

答案 4 :(得分:0)

从最长到最短的替换

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

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