【问题标题】:Remove string between two characters using no regex Javascript不使用正则表达式 Javascript 删除两个字符之间的字符串
【发布时间】:2021-12-23 02:00:18
【问题描述】:

我正在尝试从通过输入文件上传的文本文件中删除一个句子。我需要删除所有介于 '/' 和 '/' 之间的句子,所以 cmets 基本上是一行。还有所有单行 cmets,例如“//”,但我已经处理好了。为此,我不允许使用任何正则表达式或替换函数。有没有人可以帮助我?谢谢

class Inpute extends Component{
  constructor(props){
    super(props);
    this.state = {
      fileName: '',
      fileContent: ''
    };
  }

  handleFile = e =>{
    const file = e.target.files[0];
    const reader = new FileReader();
    reader.readAsText(file);
    reader.onload = () => {
      this.setState({fileName: file.name, fileContent: reader.result});
      if(reader.result.includes('//')){
        var newText = reader.result
        newText = newText
                .split('\n')
                .filter(x => !x.includes('\/\/'))
                .join('\n')

        this.setState({fileName: file.name, fileContent: newText})
      }
    }
    reader.onerror = () =>{
      console.log('File Error : ', reader.error)
    }
  }

【问题讨论】:

  • 你能发布一个示例输入
  • .filter(x => !x.includes('/*') && !x.includes('*/'))
  • 如果您拥有的代码有注释,它将删除整行。例如,像if (x === y) { // check if x equals y 这样的行也会删除if 语句。我不知道这是否重要。如果没有,那么您只需要检查该行是否包含两个 / 字符。

标签: javascript reactjs replace text-files


【解决方案1】:

/ 分割字符串。您需要删除的部分都在奇数索引中,因此请将它们过滤掉并将此数组重新连接到字符串中。

const string = 'asdasada a/kkkkkkkk/a sdad asda s/xxxxx/s dasd';

const arr = string.split('/').filter((_, index) => index%2 === 0);

console.log(arr.join(''));

更新

我已将示例更改为仅过滤 cmets

const line = 'asdasada a/*kkkkkkkk*/a sdad asda s/*xxxxxs dasd x asda sd\n' +
    'asdas */das a// asdasda\n' +
    'x/*bbbbb*/c ad';
let prevPart = null;
let haveDoubleSlashes = false;

const cleaned = line.split('/').map(part => {

    // single line comments
    if (haveDoubleSlashes || part === '') {
        haveDoubleSlashes = true;

        if (part.includes('\n')) {
            part = '\n' + part.split('\n')[1];
            haveDoubleSlashes = false;
        } else {
            part = null;
        }

        return part;
    }

    /* multiline comments */
    if (part.startsWith('*') && part.endsWith('*')) {
        prevPart = null;
        return null;
    }

    if (prevPart !== null) {
        part = '/' + part;
    }

    prevPart = part;

    return part;
}).filter(part => part !== null).join('');

console.log(cleaned);

【讨论】:

  • 谢谢,这正是我所需要的!你救了我!
  • @MikeFisher 请记住,此脚本不适用于多行 cmets。这个你必须自己弄清楚。
  • @PeterSeliger 是的。我已经说过了。
  • @ciekals11 ...感谢上次更新...它完美地通过了我的方法的多行“Lorem ipsum”测试。我的初始投票重新建立。
  • @PeterSeliger 好吧。它通过了您的测试,但并不理想。如果在多行注释 (/**/) 中是另一个单行注释 (//) 脚本将只删除该单行并且多行将保留。我没有足够的动力去修复它。
【解决方案2】:

如果您只关心该行是否包含两个斜线字符 (/),只需对其进行过滤:

const sample = `blah blah // blah blah\nblah blah /blah blah/ blah\nblah blah blah`;
const lines = sample.split('\n');
const good = lines.filter(x => 
  // [...x] makes the line an array of characters
  // reduce runs for each character, aggregating the result. 
  // agg is the aggregation, cur is the current character
  // Here it's just counting the number of /s and returning false if there are
  // fewer than two
  [...x].reduce((agg, cur) => agg = cur === '/' ? agg + 1 : agg, 0) < 2
  
);
console.log(good.join('\n'));

【讨论】:

    【解决方案3】:

    function stripMultilineComments(str) {
      let posOpen;
      let posClose;
    
      while ((posOpen = str.indexOf('/*')) !== -1) {
    
        posClose = Math.max(
          0, str.indexOf('*/', (posOpen + 2))
        ) || (str.length - 2);
    
        str = [
          str.substring(0, posOpen),
          str.substring(posClose + 2),
        ].join('');
      }
      return str;
    }
    function stripSingleLineComment(str) {
      let idx;
      if (
        (str.trim() !== '') &&
        ((idx = str.indexOf('//')) !== -1)
      ) {
        str = str.substring(0, idx);
      }
      return str;
    }
    
    function stripComments(value) {
      return stripMultilineComments(
        String(value)
      )
      .split('\n')
      .map(stripSingleLineComment)
      .join('\n');
    }
    const sampleData = `
      Lorem ipsum dolor sit amet/*, consectetur adipiscing elit,
      sed do eiusmod tempor incididunt*/ ut labore et dolore
      magna aliqua. // Ut enim ad minim veniam,
      quis nostrud exercitation ullamco laboris/*nisi ut 
      aliquip //ex ea commodo consequat*/. Duis aute irure dolor
      in reprehenderit// in voluptate velit esse cillum dolore
      eu fugiat nulla pariatur.// Excepteur sint occaecat
      /*cupidatat non //proident, */sunt in culpa qui officia
      deserunt mollit anim id est laborum.
    `;
    
    console.log(
      stripComments(sampleData)
    );
    console.log(
      stripComments(sampleData) === `
      Lorem ipsum dolor sit amet ut labore et dolore
      magna aliqua. 
      quis nostrud exercitation ullamco laboris. Duis aute irure dolor
      in reprehenderit
      eu fugiat nulla pariatur.
      sunt in culpa qui officia
      deserunt mollit anim id est laborum.
    `);
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多