如何从赛普拉斯的字符串中删除空格

How to remove whitespace from a string in Cypress

我正在尝试从表示金钱的数值中删除空格。

例如,我希望 1 000 kr1000。这与货币为 10 000

时的情况相同

我正在使用此函数删除 kr,但是当我尝试添加另一个 .replace 时它不起作用:

Cypress.Commands.add('currency', (selector) => {
      cy.get(selector)
        .children()
        .eq(1)
        .invoke('text') // get text
        .then((text) => +text.replace('kr', '').trim());
    });

我如何添加另一个 .replace 以删除数值中的额外间距?

这应该有效:

function formatString(text) {
    return text.replace('kr', '').replace('\u00A0','').trim();
}

Cypress.Commands.add('currency', (selector) => {
      cy.get(selector)
        .children()
        .eq(1)
        .invoke('text') // get text
        .then(formatString)
    });

但您也可以使用 Cypress 通过正则表达式字符串实现此目的(Cypress FAQ 中的第一个示例与您的示例类似):

Cypress.Commands.add('currency', (selector) => {
      cy.get(selector)
        .should('have.text', '\d+[\u00A0]*')
    });

您可以在此处测试正则表达式:https://regex101.com/r/YC4szy/1。它将匹配带有数字的字符串,后跟空白 space 和任何后续字符。你可以用正则表达式来测试你想要的东西。

我的最后一个建议是,如果匹配正则表达式模式没有帮助,您可以将 cypress 命令包装在一个函数中,该函数将文本内容作为参数,您将其传递到 should('have.text', ...) 行。

  是非中断 space 与“常规”中断 space:

不同

const read = sel => document.querySelector(sel).textContent;

console.log(read('div') === '1 000 kr'); // false!
<div>1&nbsp;000 kr</div>

这两个白色的space字符其实ascii码是不一样的:

const read = sel => document.querySelector(sel).textContent;
const strencode = str => [...str].map(c => c.charCodeAt(0)).join('\t');

console.log(strencode('1 000 kr'));
console.log(strencode(read('div')));
<div>1&nbsp;000 kr</div>

看看第二个字符有何不同?

您可以使用 String#normalize:

规范化字符串

const read = sel => document.querySelector(sel).textContent;

console.log(read('div').normalize('NFKC') === '1 000 kr')
<div>1&nbsp;000 kr</div>

因此,这是您问题的一种可能答案:

  1. 标准化你的字符串
  2. 删除所有 spaces (ascii 32) 字符 / /g
  3. 去掉最后的'kr'

const read = sel => document.querySelector(sel).textContent;
const clean = str => str.normalize('NFKC').replace(/ /g, '').replace(/kr$/, '');

console.log(clean(read('#div1')));
console.log(clean(read('#div2')));
<div id="div1">1&nbsp;000 kr</div>
<div id="div2">10&nbsp;000</div>

请参阅How is a non-breaking space represented in a JavaScript string?

When doing .text(), all HTML entities are decoded to their character values.

Instead of comparing using the entity, compare using the actual raw character

if (x == '\xa0') { // Non-breakable space is char 0xa0 (160 dec)

这就是您要查找的表达式

+text.replace('kr', '')  
  .replace('\xa0', '')
  .trim()

测试

<div>1&nbsp;100 kr</div>

为了说明@evolutionxbox 的想法,您可以在 element.innerText 上使用正则表达式来替换不间断空格。

Cypress.Commands.add('currency', (selector) => {
  cy.get(selector)   
    .children()
    .eq(1) 
    .then($el => +$el[0].innerText.replace(/\s/g, '').replace('kr', '') )
})