【问题标题】:how to replace string with conditions in javascript如何用javascript中的条件替换字符串
【发布时间】:2020-05-02 17:56:13
【问题描述】:

我的应用有TextAreaInput

❶=red, ❷=green, ❸=blue.

用户sentence写入TextArea:并将sentence输入Input,他想更改其颜色。

sentence 是:

Hi hola, how are you, are you ok -> 转到TextArea

how are youare youyou -> 转到 Input

现在用户想要更改一些wordscolor

第 1 步

用户选择you并希望将其color更改为red

所以正确的是:

Hi hola, how are #❶you#, are #❶you# ok

第 2 步

用户的想法变了,现在想选中are you,把两个字are youcolor改成green

所以正确的是:

Hi hola, how #❷are you#, #❷are you# ok

第 3 步

用户的想法again变了,现在想选中how are you,把三个字how are youcolor改成blue

这里的第二个are you 仍然来自Step 2

所以正确的是:

Hi hola, #❸how are you#, #❷are you# ok

现在让我们思考以上unlike

第 1 步

用户想选中how are you,把三个字how are youcolor改成red

所以正确的是:

Hi hola, #❶how are you#, are you ok

第 2 步

用户的想法变了,现在想选中are you,把两个字are youcolor改成green

所以在第1步中,他将three word (how are you)设为red,并在第2步two word (are you)颜色更改为@ 987654370@,所以one word how第一步仍然是红色的,但are yougreen

所以正确的是:

Hi hola, #❶how# #❷are you#, #❷are you# ok

第 3 步

用户的想法 again 已更改,现在只想选择you 并将一个字 youcolor 更改为blue ;

所以在 第 1 步中,他将 three word (how are you) 作为 red,在 第 2 步中,他将 one word -> how 作为redtwo word -> are yougreen,但在此步骤 3 中仅将单词 youcolor 更改为 blue,因此 how 仍然red 来自 步骤 1aregreen 来自 步骤 2youblue 来自 步骤 3

所以正确的是:

Hi hola, #❶how# #❷are# #❸you#, #❷are# #❸you# ok

//我的努力是:

let globalBalString = "Hi hola, how are you, are you ok";
let reminderObject = {};

// 这个函数在 react functional component.

const makeStyle = (sentence, colorSymbole) => {

   if(reminderObject[sentence] === undefined){
      reminderObject[sentence] = colorSymbole;
      var newString = globalBalString.replace(new RegExp(sentence, "g"), `#${colorSymbole}${sentence}#`);
      globalBalString = newString;
   }else{
      reminderObject[sentence] = colorSymbole;
      var newString = globalBalString.replace(new RegExp(`#${reminderObject[sentence]}${sentence}#`, "g"), `#${colorSymbole}${sentence}#`);
      globalBalString = newString;
   }

}

我的解决方案仅适用于步骤 1,但不适用于 步骤 2 和步骤 3

【问题讨论】:

  • 试试this approach
  • @WiktorStribiżew,非常感谢,您的解决方案仅适用于第一部分。
  • 我已经编辑了这个问题以便更好地理解,请检查一下
  • 这意味着您要在每次新搜索之前重置颜色。否则,我看不出它是怎么做到的。
  • 我已经编辑了答案的结尾。在发布答案后,您已经大大改变了问题。 SO 不允许这样做,因为它会使答案不正确。澄清是好的,实质性的变化不是。您需要回滚到原来的问题。您可以随时提出其他问题。

标签: javascript regex reactjs


【解决方案1】:

你可以使用正则表达式

(?<!\bare )\byou\b|(?<!\bhow )\bare you\b|\bhow are you\b

(设置大小写无关标志)将每个匹配替换为用井号括起来的匹配。

Javascript demo

如链接所示,为字符串

You should know better but are you crazy or how are you to know?

共有三个匹配项:youare youhow are you。当每个都被包含在井号中的自身替换时,结果字符串是

#You# should know better but #are you# crazy or #how are you# to know?

如果字符串youare youhow are you在字符串中的位置重新排列,则得到相同的结果。

Javascript 的正则表达式引擎执行以下操作。

(?<!\bare )      do not match 'are ' preceded in a word
                 break before the following match
\byou\b          match 'you' surrounded by word breaks
|                or
(?<!\bhow )      do not match 'how ' preceded in a word
                 break before the following match
\bare you\b      match 'are you' surrounded by word breaks
|                or
\bhow are you\b  match 'how are you' surrounded by word breaks

(?&lt;!...) 是一个消极的后视

动态构造正则表达式当然是必要的。我从论点"how are you" 构造了这个。我不懂 Javascript,所以我必须把它留给其他人来提供构造代码,但我已经提供了伪代码来做到这一点(实际上是简化但有效的 Ruby 代码)here

【讨论】:

  • 这是一个文本选择,所以由用户决定他们写什么和他们选择什么,在大多数情况下,我的解决方案有效,但仅适用于我在这里提到的条件它不起作用. 这意味着你的lookbehinds应该是动态创建的。
  • @Wiktor,是的,当然,但不知道 Javascript 我将它留给 OP 来动态构建正则表达式。鉴于"how are you" 的论点,我知道如何用其他语言构造正则表达式,并假设它在 Javascript 中同样简单。我的贡献是作为示例字符串的正则表达式,用作其他字符串的模式。
  • 非常感谢,我已经编辑了我的问题以便更好地理解。
  • @WiktorStribiżew,虽然不如 Javascript 有用,但我提供了用于构造正则表达式的伪代码。
【解决方案2】:

您可以使用模式和闭包函数来实现。

var str = "Hi hola, how are you, are you ok";
const replacer = (str, start) => {
  const re = new RegExp(`(${start})`, "g");
  let s = "";
  return () => {
    s = s === "" ? str.replace(re, "#$1#") : s.replace(/(\w+ )#/g, "#$1");
    return s;
  };
};
const replace = replacer(str, "you");
console.log(replace());
console.log(replace());
console.log(replace());

【讨论】:

  • 非常感谢兄弟,我只是举个例子,并不总是,Hi hola, how are you, are you ok
  • 是更新的答案..请检查。它必须从某个词开始。喜欢你。
  • 我编辑了一个hint,请检查一下,并再次考虑Inverted Expectation,非常感谢
  • 我只是赞成你的答案,兄弟仍然没有解决。
  • 你的例子不完整..你可以添加运行例子..什么是句子?
猜你喜欢
  • 2021-10-08
  • 2014-03-13
  • 2021-06-19
  • 2010-12-23
  • 2011-10-03
  • 2021-10-19
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多