【问题标题】:React js regex find all words beginning and ending with __React js正则表达式查找以__开头和结尾的所有单词
【发布时间】:2021-09-01 02:56:19
【问题描述】:

我有一个这样的 txt 文件:

Io sottoscritto/a __NOME__
nato a __CITTA_NASCITA__(__SIGLA_CITTA_NASCITA__) il __DATA_NASCITA__
residente a __RESIDENZA__   in via __VIA_RESIDENZA__    n __NUMERO_RESIDENZA__.

我必须确保当用户加载相关文件时,会创建一个数组,其中包含所有以 __ 开头并以 __ 结尾的单词,类型为 __NAME__

我设法做到了这个问题,正则表达式也找到了我以下单词:["__CITTA_NASCITA__(__SIGLA_CITTA_NASCITA__)", "__NUMERO_RESIDENZA__."]

在第一种情况下,两个词必须分开。

第二种情况一定没有终点。

结果:

["__CITTA_NASCITA__", "__SIGLA_CITTA_NASCITA__", "__NUMERO_RESIDENZA__"]

你能告诉我哪里错了吗?

链接:https://codesandbox.io/s/lively-butterfly-ey8og?file=/src/App.js

export default function App() {
  const showFile = async (e) => {
    e.preventDefault();
    const reader = new FileReader();
    reader.onload = async (e) => {
      const text = e.target.result;
      const row = text.split("\n");
      let array = [];
      row.map((el) =>
        el.split(" ").map((ul) => {
          var reg = /^__[A-Za-z]*__/;
          if (reg.test(ul)) {
            console.log(ul);
            array.push(ul);
          }
        })
      );
      console.log(array);
    };
    reader.readAsText(e.target.files[0]);
  };

  return (
    <div className="App">
      <input type="file" onChange={(e) => showFile(e)} />
    </div>
  );
}

【问题讨论】:

  • 你可以匹配文件__[A-Z]+(?:_[A-Z]+)*__regex101.com/r/oUmIJQ/1中的所有匹配项
  • 问题是所有文本都用换行符分割成行,然后每行用空格分割,并且用你的正则表达式检查项目(如果模式匹配整个“token”。标点符号等可以通过这种方式进入结果数组。请参阅我的回答如何解决这个问题。

标签: javascript reactjs regex file


【解决方案1】:

您可以通过直接从 text 变量中提取所有匹配项来修复代码:

 const reg = /__[A-Z_]+__/ig;

  const showFile = async (e) => {
    e.preventDefault();
    const reader = new FileReader();
    reader.onload = async (e) => {
      const text = e.target.result;
      let array = text.match(reg);
      setArray(array);
    };
    reader.readAsText(e.target.files[0]);
  };

请注意,如果您只允许在 __ 分隔符之间使用单个下划线,则需要使用

const reg = /__[A-Z]+(?:_[A-Z]+)*__/ig;

另外,这里不需要rowrow.map(...) 代码部分。

【讨论】:

  • 什么意思:const reg = /__[A-Z]+(?:_[A-Z]+)*__/ig;;什么时候使用?
  • @Paul 在export default function App() { 下方。将showFile 替换为我的版本。用我所有的代码 sn-p 替换您的 showFile
  • @Paul 有什么问题吗?我应该从您的代码演示中复制整个代码并实施我的修复吗?
  • 我不知道使用这个有什么区别:/__[A-Z]+(?:_[A-Z]+)*__/ig/__[A-Z_]+__/ig
  • @Paul 参见 this demothis one/__[A-Z_]+__/ig 匹配 __DATA_NASCITA____RESIDENZA__ 作为单个实体。
【解决方案2】:

我看到代码并在沙盒上运行示例 我将正则表达式稍微更改为“[A-Za-z_]+?”,现在它更准确,并且可以按照您想要的方式工作。

![输出]enter image description here

【讨论】:

  • 这只适用于正则表达式测试器。在代码中,由于使用了额外的预处理 OP,因此输出不是预期的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多